File: CHANGES.md

package info (click to toggle)
openimageio 2.5.18.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 81,508 kB
  • sloc: cpp: 141,506; python: 4,868; sh: 1,016; makefile: 384; ansic: 2
file content (5137 lines) | stat: -rw-r--r-- 322,803 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
Release 2.5.18.0 (Jan 1, 2025) -- compared to 2.5.17.0
--------------------------------------------------------
- *exr*: Avoid integer overflow for large deep exr slice strides [#4542](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4542)
- *pnm*: Broken pnm files with invalid resolution [#4561](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4561)
- *build*: Use target_compile_options (fixes a LibRaw build issue) [#4556](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4556) (by Don Olmstead)
- *testing*: Add new ref output for libheif updates [#4525](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4525)
- *ci*: Increased the macos timeout slightly to fix spurious failures [#4526](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4526)
- *ci*: Fix broken CI for ASWF 2021 and 2022 containers [#4543](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4543)
- *docs*: Clarify 'copy_image' example [#4522](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4522)
- *docs*: Update some old links to our new vanity URLs [#4533](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4533)


Release 2.5.17.0 (Nov 1, 2024) -- compared to 2.5.16.0
--------------------------------------------------------
- *iinfo*: fix: iinfo was not reading MIP levels correctly [#4498](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4498)
- *text rendering*: Windows newline shows invalid character in text render [#4501](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4501) (by peterhorvath111)
- *fix*: Address fmt exceptions for left justification [#4510](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4510)
- *perf*: Additional timing logging for performance investigations [#4506](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4506)
- *strutil.h*: Fix typo in description of Strutil::parse_values [#4512](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4512)
- *build*: Don't change CMAKE_XXX_OUTPUT_DIRECTORY when built as subdir [#4417](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4417) (by Luc Touraille)
- *deps*: Search for libbz2 only if FFmpeg or FreeType is enabled. [#4505](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4505) (by jreichel-nvidia)
- *tests*: Fixup after directory refactor of OpenImageIO-images [#4473](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4473)
- *ci*: Make scrorecards workflow not fail constantly [#4471](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4471)
- *ci*: Retire deprecated macos12 runner, try beta macos15 [#4514](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4514)
- *docs*: Update to vanity URL for the docs [#4494](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4494)


Release 2.5.16.0 (Oct 1, 2024) -- compared to 2.5.15.0
--------------------------------------------------------
- *ImageInput*: Fix: Initialize pixels of partial tile conversion buffer to avoid possible floating point exceptions. [#4462](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4462) (by Bram Stolk)
- *iv*: Fix: Iv shows constant brown and GL error messages on start-up. [#4451](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4451) (by David Adler)
- *iv*: Fix: Initialize variables before we use them. [#4457](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4457) (by Bram Stolk)
- *pnm*: Fix: Initialize m_pfm_flip before use to avoid UB. [#4446](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4446) (by Bram Stolk)
- *raw*: Fix: Check for nullptr in raw input plugin [#4448](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4448) (by Anton Dukhovnikov)
- *ci*: Streamline the old MacOS-12 CI test [#4465](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4465)
- *ci*: Test against OCIO 2.4 [#4467](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4467) and OpenEXR 3.3 [#4466](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4466)
- *docs*: Clarify TextureSystem::create use of imagecache when shared=true [#4399](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4399)
- *docs*: Switch license name in docs [#4407](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4407)
- *admin*: Change docs and comments references master -> main [#4435](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4435)


Release 2.5.15.0 (Sep 1, 2024) -- compared to 2.5.14.0
--------------------------------------------------------
- *ffmpeg*: Add proper detection of new FFmpeg versions [#4394](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4394) (by Darby Johnston)
- *ffmpeg*: Retrieve timecode metadata [#4396](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4396) (by Darby Johnston)
- *png*: Bug in associateAlpha botched alpha=0 pixels [#4386](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4386)
- *raw*: Expose additional white balancing hints [#4360](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4360) (by Anton Dukhovnikov)
- *oiiotool*: `-i:ch=...` didn't fix up alpha and z channels [#4373](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4373)
- *fix*: Catch potential OCIO exception that we were missing [#4379](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4379)
- *build*: Finish removing Imath include [#4371](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4371) (by Thiago Ize)
- *tests*: Adjust RB-2.5 simd_test to allow a little more slop on fast_exp [#4372](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4372)


Release 2.5.14.0 (Aug 1, 2024) -- compared to 2.5.13.1
--------------------------------------------------------
- *fix (png)*: Correctly read PNGs with partial alpha [#4315](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4315) (2.5.14.0)
- *fix(ImageBuf)*: Copy/paste error in the ImageBuf iterator copy constructor [#4365](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4365) (by Anton Dukhovnikov)
- *perf/TS*: Only write full metadata to the first mip level [#4320](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4320) (2.5.14.0)
- *dev(strutil.h)*: Strutil::string_is_identifier() [#4333](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4333) (2.5.14.0)
- *build*: Avoid rebuilds due to processing of fmt headers [#4313](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4313) (by Jesse Yurkovich) (2.5.14.0)
- *build*: Fix boost vs cmake 3.30 problem.
- *ci*: Sanitizer new warnings about signed/unsigned offsets in openexr [#4351](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4351) (2.5.14.0)
- *docs*: Clarify that `IBA::rotate` params are pixel coordinates [#4358](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4358) (2.5.14.0)
- *admin*: More CLA explanation and how-to links [#4318](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4318) (2.5.14.0)
- *admin*: Document my git-cliff workflow for release notes [#4319](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4319) (2.5.14.0)
- *security*: Document CVE-2024-40630 resolution (2.5.14.0)


Release 2.5.13.1 (July 15, 2024) -- compared to 2.5.13.0
--------------------------------------------------------
- fix(heic): Correctly set imagespec size for heif images.
 [security advisory](https://github.com/AcademySoftwareFoundation/OpenImageIO/security/advisories/GHSA-jjm9-9m4m-c8p2) (by Gerrard Tai)

Release 2.5.13.0 (July 1, 2024) -- compared to 2.5.12.0
-------------------------------------------------------
- *fix*: Various PSD files fail to load correctly [#4302](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4302) (by Jesse Yurkovich)
- *fix*: Improve error messages when a font is not found [#4284](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4284)
- *platform.h*: In platform.h, define OIIO_DEVICE macro [#4290](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4290)
- *ci*: Typo in build_libtiff.bash [#4280](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4280)
- *docs*: Update INSTALL.md for windows [#4279](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4279) (by Mel Massadian)
- *docs*: Fixes to formatting and sphinx warnings [#4301](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4301)


Release 2.5.12.0 (June 1, 2024) -- compared to 2.5.11.0
-------------------------------------------------------
- *exr*: Add IOProxy support for EXR multipart output [#4263](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4263) [#4264](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4264) (by jreichel-nvidia)
- *pnm*: Improvements to pnm plugin: support for uint16 and 32-float, "pnm:bigendian" and "pnm:pfmflip" controls for output. [#4253](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4253) (by Vlad (Kuzmin) Erium)
- *ImageBuf*: Improve behavior of IB::nsubimages and other related fixes [#4228](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4228)
- *simd.h*: Fix longstanding problem with 16-wide bitcast for 8-wide HW [#4268](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4268)
- *strutil.h*: Add Strutil::eval_as_bool [#4250](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4250)
- *tests*: Add new heif test output [#4262](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4262)
- *tests*: Fix windows quoting for test [#4271](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4271)
- *build*: More warning elimination for clang18 [#4257](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4257)
- *build*: Add appropriate compiler defines and flags for SIMD with MSVC [#4266](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4266) (by Jesse Yurkovich)
- *build*: Gcc-14 support, testing, CI [#4270](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4270)
- *docs*: Fix stray references to the old repo home [#4255](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4255)


Release 2.5.11.0 (May 1, 2024) -- compared to 2.5.10.0
-------------------------------------------------------
- *dds*: DDS support more DXGI formats [#4220](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4220) (by alexguirre)
- *psd*: Add support for 16- and 32-bit Photoshop file reads [#4208](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4208) (by EmilDohne)
- *fix(fmt.h)*: Fix build break from recent fmt change [#4227](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4227)
- *fix(openexr)*: Fix out-of-bounds reads when using OpenEXR decreasingY lineOrder. [#4215](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4215) (by Aaron Colwell)
- *fix*: Don't use (DY)LD_LIBRARY_PATH as plugin search paths [#4245](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4245) (by Brecht Van Lommel)
- *fix*: Fix crash when no default fonts are found [#4249](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4249)
- *build*: Disable clang18 warnings about deprecated unicode conversion [#4246](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4246)
- *security*: Better documentation of past CVE fixes in SECURITY.md [#4238](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4238)


Release 2.5.10.1 (Apr 1, 2024) -- compared to 2.5.9.0
------------------------------------------------------
- *oiiotool*: Expression substitution now understands pseudo-metadata `NONFINITE_COUNT` that returns the number of nonfinite values in the image, thus allowing decision making about fixnan [#4171](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4171)
- *color managements*: Automatically recognize some additional color space name synonyms: "srgb_texture", "lin_rec709" and "lin_ap1". Also add common permutation "srgb_tx" and "srgb texture" as additional aliases for "srgb". [#4166](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4166)
- *openexr*: Implement copy_image for OpenEXR [#4004](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4004) (by Andy Chan)
- *heic*: Don't auto-transform camera-rotated images [#4142](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4142) [#4184](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4184)
- *hash.h*: Mismatched pragma push/pop in hash.h [#4182](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4182)
- *simd.h*: gather_mask() was wrong for no-simd fallback [#4183](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4183)
- *texture.h*: Overload decode_wrapmode to support ustringhash [#4207](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4207) (by Chris Hellmuth)
- *build*: Fix warning when Freetype is disabled [#4177](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4177)
- *build*: iv build issues with glTexImage3D [#4202](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4202) (by Vlad (Kuzmin) Erium)
- *build*: Fix buld_ninja.bash to make directories and download correctly [#4192](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4192) (by Sergio Rojas)
- *build*: Need additional include [#4194](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4194)
- *build*: FindOpenColorIO failed to properly set OpenColorIO_VERSION [#4196](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4196)
- *build*: Restore internals of strhash to compile correctly on 32 bit architectures [#4123](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4123)
- *ci*: Allow triggering CI workflow from web [#4178](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4178)
- *ci*: Make one of the Mac tests build for avx2 [#4188](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4188)
- *ci*: Enable Windows 2022 CI tests [#4195](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4195)
- *docs*: Fix some typos and add missing oiiotool expression explanations [#4169](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4169)
- *admin*: Add a ROADMAP document [#4161](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4161)


Release 2.5.9.0 (Mar 1, 2024) -- compared to 2.5.8.0
-----------------------------------------------------
- *oiiotool*: Overhaul and fix bugs in mixed-channel propogation [#4127](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4127)
- *oiiotool*: Fixes to buildinfo queries [#4150](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4150)
- *dcmtk*: Fixes for DCMTK [#4147](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4147)
- *build*: Address NEON issues in simd.h. [#4143](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4143)
- *typedesc.h*: Allow TypeDesc to have all the right POD attributes [#4162](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4162) (by Scott Wilson)
- *internals*: Various fixes for memory safety and reduce static analysis complaints [#4128](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4128)
- *internals*: Coalesce redundant STRINGIZE macros -> OIIO_STRINGIZE [#4121](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4121)
- *ci*: Start using macos-14 ARM runners, bump latest OCIO [#4134](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4134)
- *ci*: Switch away from deprecated GHA idiom set-output [#4141](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4141)
- *ci*: Add vfx platform 2024 [#4163](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4163)
- *ci*: Fix Windows CI, need to build newer openexr and adjust boost search [#4167](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4167)
- *tests*: Add test for filter values and 'filter_list' query [#4140](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4140)
- *docs*: Update SECURITY and RELEASING documentation [#4138](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4138)
- *docs*: Fix tab that was missing from the rendering on rtd [#4137](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4137)
- *docs*: Fix python example [#4139](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4139)
- *admin*: More updated relicensing code under Apache 2.0


Release 2.5.8.0 (Feb 1, 2024) -- compared to 2.5.7.0
-----------------------------------------------------
- *feat(oiiotool)*: New `--buildinfo` command prints build information,
  including version, compiler, and all library dependencies. [#4124](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4124)
- *feat(api)*: New global getattribute queries: "build:platform",
  "build:compiler", "build:dependencies" [#4124](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4124)
- *feat(openexr)*: Add support for luminance-chroma OpenEXR images. [#4070](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4070) (by jreichel-nvidia)
- *fix(raw)*: Avoid buffer overrun for flip direction cases [#4100](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4100)
- *fix(iv)*: Assume iv display gamma 2.2 if `GAMMA` env variable is not set [#4118](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4118)
- *fix*: Fixes to reduce problems identified by static analysis [#4113](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4113)
- *dev(simd.h)*: Make all-architecture matrix44::inverse() [#4076](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4076)
- *dev(simd.h)*: Fix AVX-512 round function [#4119](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4119) (by AngryLoki)
- *build(deps)*: Remove Findfmt.cmake, rely on that package's exported config. [#4069](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4069) [#4103](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4103) (by Dominik Wójt)
- *build(deps)*: Account for header changes in fmt project trunk [#4109](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4109) [#4114](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4114)
- *tests*: Shuffle some tests between directories [#4091](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4091)
- *tests*: Fix docs test, used wrong namespace [#4090](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4090)
- *docs*: Fix broken IBA color management documentation [#4104](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4104)
- *style*: Update our formatting standard to clang-format 17.0 and C++17 [#4096](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4096)


Release 2.5.7.0 (Jan 1, 2024) -- compared to 2.5.6.0
-----------------------------------------------------
- *fix(iv)*: Avoid crash with OpenGL + multi-channel images [#4087](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4087)
- *fix(png)*: Fix crash for writing large PNGs with alpha [#4074](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4074)
- *fix(ImageInput)*: Only check REST arguments if the file does not exist, avoiding problems for filenames that legitimately contain a `?` character. [#4085](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4085) (by AdamMainsTL)
- *perf(IBA)*: Improve perf of ImageBufAlgo::channels in-place operation [#4088](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4088)
- *build*: Ptex support for static library [#4072](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4072) (by Dominik Wójt)
- *build*: Add a way to cram in a custom extra library for iv [#4086](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4086)
- *build*: JPEG2000: Include the headers we need to discern version [#4073](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4073)
- *tests*: Improve color management test in imagebufalgo_test [#4063](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4063)
- *tests*: Add one more ref output for python-colorconfig test [#4065](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4065)
- *ci*: Restrict Mac ARM running [#4077](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4077)
- *ci*: Rename macro to avoid conflict during CI unity builds [#4092](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4092)
- *docs*: Fix typo [#4089](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4089)
- *docs*: Fix link to openexr test images [#4080](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4080) (by Jesse Yurkovich)
- *admin*: Account for duplicate emails in the .mailmap [#4075](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4075)
- *dev*: Faster vint4 load/store with unsigned char conversion [#4071](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4071) (by Aras Pranckevičius)

Release 2.5.6.0 (Dec 1, 2023) -- compared to 2.5.5.0
-----------------------------------------------------
- *oiiotool*: --autocc bugfix and color config inventory cleanup [#4060](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4060)
- *idiff*: Fix issue when computing perceptual diff [#4061](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4061) (by Aura Munoz)
- *ci*: Add tiff-misc reference for slightly changed error messages [#4052](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4052)
- *ci*: Remove MacOS-11 test [#4053](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4053)
- *ci*: Test against gcc-13 [#4059](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4059)
- *build*: Better cmake verbose behavior [#4037](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4037)
- *docs*: Update INSTALL.md to reflect the latest versions we've tested against [#4058](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4058)
- *admin*: Fix typo in slack-release-notifier version [#4046](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4046) [#4047](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4047)
- *admin*: More relicensing code under Apache 2.0 [#4038](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4038)

Release 2.5.5.0 (Nov 1, 2023) -- compared to 2.5.4.0
-----------------------------------------------------
- *build*: Provide compile_commands.json for use by tools [#4014](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4014) (by David Aguilar)
- *build*: Don't fail for 32 bit builds because of static_assert check [#4006](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4006)
- *build*: Protect against mismatch of OpenVDB vs C++ [#4023](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4023)
- *build*: Adjust OpenVDB version requirements vs C++17 [#4030](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4030)
- *ci*: CI tests on MacOS ARM, and fixes found consequently [#4026](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4026)
- *idiff*: Allow users to specify a directory as the 2nd argument [#4015](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4015) (by David Aguilar)
- *iv*: Implement Directory Argument Loading for iv [#4010](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4010) (by Chaitanya Sharma)
- *iv*: Split off the current image in iv into a separate window [#4017](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4017) (by Anton Dukhovnikov)
- Print unretrieved global error messages [#4005](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4005)
- *ImageBuf*: Fix crash when mutable Iterator used with read-IB [#3997](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3997)
- *exr*: Handle edge case of exr attribute that interferes with our hints [#4008](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4008)
- *raw*: LibRaw wavelet denoise options [#4028](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4028) (by Vlad (Kuzmin) Erium)
- *OpenCV*: IBA::to_OpenCV fails for ImageCache-backed images [#4013](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4013)
- *tests*: Add opencv regression test [#4024](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/4024)


Release 2.5 (2.5.4.0, Oct 1, 2023) -- compared to 2.4
-----------------------------------------------------

### New minimum dependencies and compatibility changes:
* CMake: minimum needed to build OpenImageIO has been raised from 3.12 to
  3.15.  [#3924](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3924) (2.5.2.1)
* LibRaw: minimum has ben raised from 0.15 to 0.18.
  [#3921](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3921) (2.5.2.1)
* The new OpenEXR minimum is 2.4 (raised from 2.3).
  [#3928](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3928) (2.5.2.1)
* The new `fmt` library minimum is 7.0 (raised from 6.1)
  [#3973](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3973) (2.5.3.0)
* The new libjpeg-turbo (if used; it is optional) has been raised to
  2.1. [#3987](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3987) (2.5.3.1-beta2)

### ⛰️  New features and public API changes:

* TextureSystem color management: [#3761](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3761) (2.5.1.0)
    - TextureOpt and TextureOptBatch have a new field, `colortransformid`,
      which supplies an integer ID for a requested color space transformation
      to be applied as texture tiles are read. The default value 0 means no
      transformation because the texture is presumed to be in the working
      color space (this is the old behavior, and most performant). Tiles from
      the same texture file but using different color transformations are
      allowed and will not interfere with each other in the cache.
    - New `TextureSystem::get_colortransform_id(from, to)` maps from/to named
      color spaces to a color transform ID that can be passed to texture
      lookup calls.
    - `ImageCache::get_image_handle` and `TextureSystem::get_texture_handle`
      now take an optional `TextureOpt*` parameter that can supply additional
      constraints (such as color transformation) that TS/IC implementations
      may wish to split into separate handles. This is currently not used, but
      is reserved so that the API doesn't need to be changed if we use it in
      the future.
    - texture.h defines symbol `OIIO_TEXTURESYSTEM_SUPPORTS_COLORSPACE` that
      can be tested for existence to know if the new fields are in the
      TextureOpt structure.
* Extensive support for OpenColorIO 2.2 functionality and improved color
  management:
    - When building against OCIO 2.2, you can specify/use the new "built-in"
      configs, including using `ocio://default`, which will automatically be
      usd if no config is specified and the `$OCIO` variable is not set #3662
      #3707 (2.5.0.0)
    - OIIO tries to find and honor the common color space aliases
      "scene_linear", "srgb", "lin_srgb", and "ACEScg". When building against
      OCIO 2.2+, it will know which of any config's color spaces are
      equivalent to these, even if they are named something totally different,
      thanks to the magic of OCIO 2.2 built-in configs. For older OCIO (2.1 or
      older), it is less robust and may have to make best guesses based on the
      name of the color spaces it finds. [#3707](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3707) (2.5.0.0)
      [#3995](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3995) (2.5.3.2-rc1)
    - New ColorConfig methods: `getAliases()` #3662; `isColorSpaceLinear()`
      #3662; `resolve(name)` turns any color space name, alias, role, or OIIO
      name (like "sRGB") into a canonical color space name;
      `equivalent(n1,n2)` returns true if it can tell that the two names
      refer, ultimately, to equivalent color spaces #3707 (2.5.0.0)
    - New `ImageSpec::set_colorspace()` method is a more thorough way to set
      the color space data than simply setting the "oiio:ColorSpace" metadata
      (though it also does that). #3734 (2.5.0.1)
    - Improve OIIO's ability to guess which of the config's color space names
      are aliases for common spaces such as srgb, lin_srgb, and acescg (quite
      robustly if using OCIO >= 2.2, even for totally nonstandard names in the
      config). #3755 (2.5.0.1)
    - New `ColorConfig::getColorSpaceIndex()` looks up a color space index by
      its name, alias, or role. #3758 (2.5.0.1)
* oiiotool new commands and features:
    - New `--iccread` and `--iccwrite` add an ICC profile from an external
      file to the metadata of an image, or extract the ICC profile metadata
      and save it as a separate file. #3550 (2.5.0.0)
    - New `--parallel-frames` parallelizes execution over a frame range rather
      than over regions within each image operation. This should be used with
      caution, as it will give incorrect results for an oiiotool command line
      involving a frame range where the iterations have a data dependency on
      each other and must be executed in order. But in cases where the order
      of frame processing doesn't matter and there are many more frames in the
      sequence than cores, you can get a substantial performance improvement
      using this flag. [#3849](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3849) (2.5.2.0)
    - New `--no-error-exit` causes an error to not exit immediately, but
      rather to try to execute the remaining command line operations. This is
      intended primarily for unit tests and debugging. #3643 (2.5.0.0)
    - New `--colorconfiginfo` prints the full inventory of color management
      information, including color space aliases, roles, and with improved
      readability of output for larger configs. #3707 (2.5.0.0)
    - The `--resize` command takes new optional `:from=`, `:to=`, and
      `:edgeclamp=` modifiers to give more general and fine control over the
      specific correspondence between display windows in the input image and
      resized destination image (including allowing partial pixel offsets).
      #3751 #3752 (2.5.0.1)
    - New expression substitution additions:
        - New syntax for retrieving metadata `{TOP[foo]}` is similar to the
          existing `{TOP.foo}`, if there is no `foo` metadata found, the
          former evaluates to an empty string, whereas the latter is an error.
          #3619 (2.4.5/2.5.0.0)
        - `{NIMAGES}` gives current stack depth
          [#3822](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3822)  (2.5.2.0)
        - `{nativeformat}` is the pixel data format of the file, whereas the
          existing `format` has always returned the data type used in memory.
          Also, `METANATIVE` and `METANATIVEBRIEF` are the full metadata
          keywords for native file metadata, comapred to the previously
          existing `META` and `METABRIEF` which we now clarify reflect the
          in-memory representation. #3639 (2.5.0.0)
    - `--ociodisplay` now takes an optional `:inverse=1` modifier. #3650
      (2.5.0.0)
    - New `-otex` optional modifier `forcefloat=0` can improve memory use for
      enormous texture conversion.
      [#3829](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3829) (2.5.2.0)
    - `--printinfo` now takes new optional modifiers: `:native=1` ensures
      that the metadata printed is of the file, not changed by the way the
      image is stored in memory (for example, it may have been converted to
      a more convenient in-memory data type); `:verbose=1` prints verbose
      stats even if `-v` is not used; `:stats=1` prints full pixel stats,
      even if `--stats` is not used. #3639 (2.5.0.0)
    - New `--normalize` mormalizes image that represent 3D vectors (i.e.,
      divide by their length) textures. This is helpful for normal maps.
      [#3945](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3945) (by Vlad (Kuzmin) Erium) (2.5.3.0)
* ImageBufAlgo additions:
    - A new flavor of `ociodisplay()` now contains an inverse parameter.
      #3650 (2.5.0.0)
    - New `normalize()` normalizes image that represent 3D vectors (i.e.,
      divide by their length) textures. This is helpful for normal maps.
      [#3945](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3945) (by Vlad (Kuzmin)
      Erium) [#3963](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3963) (2.5.3.0)
* ImageBuf changes:
    - *ImageBuf*: Only back IB with IC when passed an IC
      [#3986](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3986) (2.5.3.1-beta2)
* ImageInput / ImageOutput:
    - New `ImageOutput::check_open()` method can be used by format writers
      authors to centralize certain validity tests so they don't need to be
      implemented separately for each file type. This is not meant to be
      called by client application code, only by format writer authors. #3686
      (2.5.0.0)
    - Add an `ImageInput::valid_file(IOProxy)` overload
      [#3826](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3826) (by Jesse Y)
      (2.5.2.0) and implement its overloads for DDS, PSD, and WEBP
      [#3831](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3831)  (by Jesse Y)
      (2.5.2.0)
    - New `ImageOutput::check_open()` and `ImageInput::open_check()` can be
      used by format reader/writer authors to centralize certain validity
      tests so they don't need to be implemented separately for each file
      type. This is not meant to be called by client application code, only by
      format reader/writer authors.
      [#3686](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3686) (2.5.0.0)
      [#3967](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3967) (2.5.3.0)
    - *ImageInput*: Add an ImageInput::valid_file(IOProxy) overload
      [#3826](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3826)  (by Jesse Y) (2.5.2.0)
    - *ImageInput*: Implement valid_file(IOProxy) overloads for DDS, PSD, and
      WEBP [#3831](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3831)  (by Jesse
      Y)  (2.5.2.0)
* New top-level `namespace OIIO` functions:
    - `OIIO::shutdown()` method [#3882](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3882) (by Ray Molenkamp)
    - `OIIO::default_thread_pool_shutdown()` [#2382](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/2382)
    - `OIIO::print()` exposes `Strutil::print()` in the main OIIO namespace.
  #3667 (2.4.6/2.5.0.0)
* OIIO::getattribute() new queries:
    - `font_list`, `font_file_list`, `font_dir_list` return, respectively, the
      list of fonts that OIIO found, the list of full paths to font files, and
      the list of directories searched for fonts. All return a single string
      that is a semicolon-separated list of the items. #3633 (2.5.0.0)
    - `opencolorio_version` returns the human-readable (e.g. "2.2.0") version
      of OpenColorIO that is being used. #3662 (2.5.0.0)
* Python bindings:
    - Implement `ImageCache.get_imagespec()` [#3982](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3982) (2.5.3.1-beta2)
* IOProxy support for additional file formats: SGI #3641, RLA #3642, IFF #3647
  (2.5.0.0), ICO input [#3919](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3919)
  (by jasonbaumeister) (2.5.2.0)
* Remove long deprecated/nonfunctional C API headers [#3567](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3567)

### 🚀  Performance improvements:

* Fixed some ImageBuf and IBA internals to avoid unnecessary/redundant zeroing
  out of newly allocated buffer memory. #3754 (2.5.0.1)
* *oiiotool*: `--parallel-frames` parallelizes execution over a frame
  range rather than over regions within each image operation.
  [#3849](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3849)  (2.5.2.0)
* *psd*: Improve memory efficiency of PSD read
  [#3807](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3807)  (2.5.2.0)
* Improvements to performance and memory when making very large textures
  [#3829](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3829) (2.5.2.0)
* OpenEXR: Change to using exr-core for reading by default [#3788](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3788)
* TextureSystem: Improve texture lookup performance by remove redundant
  instructions from tile hash [#3898](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3898) (by Curtis Black) (2.5.2.0)
* *oiiotool*: `--mosaic` improvements to type conversion avoid unnecessary
  copies and format conversions. [#3979](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3979) (2.5.3.1-beta2)

### 🐛  Fixes and feature enhancements:

* ImageInput: fix typo in debug output [#3956](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3956) (by Jesse Yurkovich)
* Python bindings:
    - Add ability to `getattribute()` of int64 and uint64 data [#3555](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3555) (2.5.0.0)
    - Fixed ability to add and retrieve `uint8[]` metadata, which on the
      python side will be numpy arrays of type uint8 (dtype='B'). This is
      important for being able to set and retrieve "ICCProfile" metadata.
      #3556 (2.5.0.0)
    - Eliminate redundant code in Python IBA bindings [#3615](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3615)
    - Improve error messages for when passing incorrect python array sizes.
      #3801 (2.5.1.0)
    - Fix arithmetic overflow in oiio_bufinfo (Python interop) [#3931](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3931) (by Jesse Yurkovich) (2.5.2.0)
* ImageBuf improvements:
    - Fixes to subtle bugs when ImageBuf is used with IOProxy. #3666
      (2.4.6/2.5.0.0)
    - Auto print uncaught ImageBuf errors. When an IB is destroyed, any errors
      that were never retrieved via `geterror()` will be printed, to aid users
      who would not notice the errors otherwise.
      [#3949](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3949) (2.5.3.0)
    - oiiotool now does immediate reads without relying on an ImageCache,
      unless the `--cache` option is used, which now both enables the use of
      an underlying IC as well as setting its size.
      [#3986](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3986) (2.5.3.1-beta2)
* ImageBufAlgo improvements:
    - IBAPrep should not zero out deep images when creating a new destination
      image. #3724 (2.5.0.0/2.4.8.0)
    - Improve error message for IBA::ocio functions [#3887](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3887)
    - UTF-8 text rendering fixes [#3935](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3935)
      (by Nicolas) (2.5.3.0)
* make_texture() / maketx / TextureSystem / ImageCache:
    - Ensure proper setting of certain metadata when using a texture as a
      source to build another texture. #3634 (2.4.5/2.5.0.0)
    - Minor improvements in statistics printing for IC. #3654 (2.5.0.0)
    - When creating a texture, don't overwrite an existing DateTime metadata
      in the source file. #3692 (2.5.0.0)
    - Fix environment mapping in batch mode when >4 channels are requested in
      a lookup. #3694 (2.5.0.0)
    - Fixed `maketx --lightprobe`, which never worked properly for images
      that weren't `float` pixel data type. #3732 (2.5.0.0/2.4.7.0)
    - Fix bad handling of `maketx --cdf`, which was trying to take an extra
      command line argument that it didn't need. #3748 (2.5.0.1)
    - Improve IC statistics appearance by omitting certain meaningless stats
      when no files were read by the IC/TS. #3765 (2.4.9.0/2.5.0.1)
    - Fixes that avoid deadlock situations on the file handle cache in certain
      scenarios with very high thread contention. #3784 (2.4.10.0/2.5.0.3)
    - maketx and oiiotool --otex: Add support for CDFs of bumpslopes channels.
      Previously, if you used both --bumpslopes and --cdf at the same time,
      the CDFs were not produced for all channels. #3793 (by Tom Knowles) (2.4.10.0/2.5.1.0)
* oiiotool improvements:
    - When `-q` (quiet mode) is used, and when an error occurs, only print the
      error message and not the full help message. #3649 (2.5.0.0)
    - Fix problems with `--point` when there is no alpha channel. #3684
      (2.4.6/2.5.0.0)
    - `--dumpdata` fix channel name output. #3687 (2.4.6/2.5.0.0)
    - `--help` now prints a much abbreviated color management section (just the
      OCIO version and config file). Use the new `--colorconfiginfo` argument
      to print the full color management information, which is both more
      readable and more detailed than what `--help` used to print. #3707
      (2.5.0.0)
    - Don't propagate unsupported channels
      [#3838](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3838)  (2.5.2.0)
    - *oiiotool*: Work around static destruction order issue #3295 [#3591](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3591) (by Aras Pranckevičius)
* ICC Profiles found in JPEG, JPEG-2000, PSN, PSD, and TIFF files are now
  examined and several key fields are extracted as separate metadata. #3554
  (2.5.0.0)
* Various protections against corrupted files [#3954](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3954) (2.5.3.0)
* BMP:
    - Fix reading 16bpp images. [#3592](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3592) (by Aras Pranckevičius) (2.4.5/2.5.0.0)
    - Protect against corrupt pixel coordinates. (TALOS-2022-1630,
      CVE-2022-38143) [#3620](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3620) (2.4.5/2.5.0.0)
    - Fix possible write errors, fixes TALOS-2022-1653 / CVE-2022-43594,
      CVE-2022-43595. #3673 (2.4.6/2.5.0.0)
    - Mark color space as sRGB, which seems likely to be true of any BMP
      files anybody encounters. #3701 (2.5.0.0)
    - Fix signed integer overflow when computing total number of pixels.
      Fixes CVE-2023-42295. [#3948](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3948) (by xiaoxiaoafeifei) (2.5.3.0)
* DDS:
    - Fix heap overflow in DDS input. #3542 (2.5.0.0)
    - Improved support for DTX5, ATI2/BC5 normal maps, R10G10B10A2
      format, RXGB, BC4U, BC5U, A8, improved low bit expansion to 8 bits.
      [#3573](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3573)
      (by Aras Pranckevičius)(2.4.4.2/2.5.0.0)
    - Fix alpha/luminance files, better testing. [#3581](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3581) (by Aras Pranckevičius) (2.4.5/2.5.0.0)
    - Optimize loading of compressed images, improves 3-5x. [#3583](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3583) (by Aras Pranckevičius) #3584
      (2.4.5/2.5.0.0)
    - Honor ImageInput thread policy [#3584](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3584)
    - Fix crashes for cubemap files when a cube face was not present, and
      check for invalid bits per pixel. (TALOS-2022-1634, CVE-2022-41838)
      (TALOS-2022-1635, CVE-2022-41999) [#3625](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3625) (2.4.5/2.5.0.0)
      (TALOS-2022-1635, CVE-2022-41999) #3625 (2.4.5/2.5.0.0)
    - Fix divide-by-0 during DXT4 DDS load [#3959](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3959) (by Jesse Yurkovich) (2.5.3.0)
* DPX:
    - Fix possible write errors, fixes TALOS-2022-1651 / CVE-2022-43592 and
      TALOS-2022-1652 / CVE-2022-43593. #3672 (2.4.6/2.5.0.0)
* FITS:
    - Ensure that the file is closed if open fails to find the right magic
      number. #3771 (2.5.1.0)
* GIF:
    - Fix potential array overrun when writing GIF files. #3789
      (2.4.10.0/2.5.1.0)
    - Prevent heap-buffer-overflow
      [#3841](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3841) (2.5.2.0) (by
      xiaoxiaoafeifei)
* HEIC:
    - Support the ".hif" extension, which seems to be used by some Canon
      cameras instead of .heif.
      [#3813](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3813)(by AdamMainsTL)
* HDR:
    - Fix a 8x (!) read performance regression for HDR files that was
      introduced in OIIO in 2.4. On top of that, speed up by another 4x beyond
      what we ever did before by speeding up the RGBE->float conversion.
      [#3588](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3588) [#3590](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3590)
      (by Aras Pranckevičius) (2.4.5/2.5.0.0)
* ICO:
    - Heap-buffer-overflow [#3872](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3872)  (by xiaoxiaoafeifei)  Fixes CVE-2023-36183.
* IFF:
    - Protect against 0-sized allocations. #3603 (2.5.0.0)
    - IOProxy support. #3647 (2.4.6/2.5.0.0)
      FIXME Temporarily disable IOProxy support to avoid bugs in #3760
      (2.5.0.1)
    - Fix possible write errors, fixes TALOS-2022-1654 / CVE-2022-43596,
      TALOS-2022-1655 / CVE-2022-43597 CVE-2022-43598, TALOS-2022-1656 /
      CVE-2022-43599 CVE-2022-43600 CVE-2022-43601 CVE-2022-43602  #3676
      (2.4.6/2.5.0.0)
    - Catch possible exception, identified by static analysis [#3681](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3681)
* JPEG
    - *jpeg*: Fix density calculation  for jpeg output
      [#3861](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3861)  (2.5.2.0) (by
      Loïc Vital) 
* JPEG2000:
    - Better pixel type promotion logic [#3878](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3878) (2.5.2.0)
* OpenEXR:
    - Fix potential use of uninitialized value when closing. #3764 (2.5.0.1)
    - Try to improve exr thread pool weirdness
      [#3864](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3864)  (2.5.2.0)
    - Controlled shutdown of IlmThread pool in all apps in which we use it.
      [#3805](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3805)  (2.5.2.0)
    - Correction to dwa vs zip logic when outputting OpenEXR [#3884](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3884) (2.5.2.0)
    - Enable openexr core library by default when recent enough
      [#3942](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3942) (2.5.3.0)
* PBM:
    - Fix accidental inversion for 1-bit bitmap pbm files. [#3731](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3731)
      (2.5.0.0/2.4.8.0)
* PNG:
    - Fix memory leaks for error conditions. #3543 #3544 (2.5.0.0)
    - Add EXIF write support to PNG output. [#3736](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3736) (by Joris Nijs) (2.5.0.1)
    - Write out proper tiff header version in png EXIF blobs
      [#3984](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3984) (by Jesse
      Yurkovich) (2.5.3.1-beta2)
    - A variety of minor optimizations to the PNG writer
      [#3980](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3980) (2.5.3.2-rc1)
    - Improve PNG write data quality when alpha is low
      [#3985](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3985) (2.5.3.2-rc1)
* PSD:
    - Fix a PSD read error on ARM architecture. #3589 (2.4.5/2.5.0.0)
    - Protect against corrupted embedded thumbnails. (TALOS-2022-1626,
      CVE-2022-41794) #3629 (2.4.5/2.5.0.0)
    - Fix thumbnail extraction. #3668 (2.4.6/2.5.0.0)
    - When reading, don't reject padded thumbnails. #3677 (2.4.6/2.5.0.0)
    - Fix wrong "oiio:UnassociatedAlpha" metadata. #3750 (2.5.0.1)
    - Handle very wide images with more than 64k resolution in either
      direction. #3806 (2.5.1.0/2.4.11)
    - Improve memory efficiency of PSD read [#3807](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3807)  (2.5.2.0)
    - Prevent simultaneous psd thumbnail reads from clashing [#3877](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3877)
    - CMYK PSD files now copy alpha correctly [#3918](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3918) (by jasonbaumeister) (2.5.2.0)
* RAW:
    - Add color metadata: pre_mul, cam_mul, cam_xyz, rgb_cam. #3561 #3569
      #3572 (2.5.0.0)
    - Update Exif orientation if user flip is set. #3669 (2.4.6/2.5.0.0)
    - Correctly handle 1-channel raw images. #3798 (2.5.1.0/2.4.11.0)
    - Fix LibRaw flip to Exif orientation conversion
      [#3847](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3847)
      [#3858](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3858)  (2.5.2.0) (by
      Loïc Vital) 
* RLA:
    - Fix potential buffer overrun. (TALOS-2022-1629, CVE-2022-36354) #3624
      (2.4.5/2.5.0.0)
    - IOProxy support. #3642 (2.5.0.0)
    - Fix possible invalid read from an empty vector during RLA load
      [#3960](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3960) (by Jesse Yurkovich) (2.5.3.0)
* SGI:
    - IOProxy support. #3641 (2.5.0.0)
* Targa:
    - Fix incorrect unique_ptr allocation. #3541 (2.5.0.0)
    - Fix string overflow safety. (TALOS-2022-1628, CVE-2022-41981)
      [#3622](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3622) (2.4.5/2.5.0.0)
    - Guard against corrupted tga files Fixes TALOS-2023-1707 /
      CVE-2023-24473, TALOS-2023-1708 / CVE-2023-22845. #3768 (2.5.1.0/2.4.8.1)
* TIFF:
    - Guard against corrupt files with buffer overflows. (TALOS-2022-1627,
      CVE-2022-41977) [#3628](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3628) (2.4.5/2.5.0.0)
    - Guard against buffer overflow for certain CMYK files. (TALOS-2022-1633,
      CVE-2022-41639) (TALOS-2022-1643, CVE-2022-41988)
      [#3632](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3632) (2.4.5/2.5.0.0)
    - While building against the new libtiff 4.5, use its new per-tiff error
      handlers to ensure better thread safety. #3719 (2.5.0.0/2.4.8.0)
    - Better logic for making TIFF PhotometricInterpretation tag and
      oiio:ColorSpace metadata correspond to each other correctly for TIFF
      files. [#3746](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3746) (2.5.0.1)
    - Fix: race condition in TIFF reader, fixes TALOS-2023-1709 /
      CVE-2023-24472. #3772 (2.5.1.0/2.4.8.1)
    - Disable writing TIFF files with JPEG compression -- it never worked
      properly and we can't seem to fix it. The fact that nobody noticed that
      it never worked is taken as evidence that nobody needs it. If asked for,
      it just uses the default ZIP compression instead. The TIFF reader can
      still read JPEG-compressed TIFF files just fine, it's only writing that
      appears problematic. #3791 (2.5.0.4)
* Zfile:
    - Zfile write safety, fixes TALOS-2022-1657 / CVE-2022-43603. #3670
      (2.4.6/2.5.0.0)
* Exif (all formats that support it, TIFF/JPEG/PSD):
    - Fix EXIF bugs where corrupted exif blocks could overrun memory.
      (TALOS-2022-1626, CVE-2022-41794) (TALOS-2022-1632, CVE-2022-41684)
      (TALOS-2022-1636 CVE-2022-41837) #3627 (2.4.5/2.5.0.0)
    - Fix typo that prevented us from correctly naming Exif
      "CameraElevationAngle" metadata.
      [#3783](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3783) (by Fabien
      Castan) (2.4.10.0/2.5.1.0)
    - Convert paramvalue string to integer when needed [#3886](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3886) (by Fabien Servant @ TCS) (2.5.2.0)
    - Squash some alignment problems caught by ubsan [#3646](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3646)
* Fix missing OIIO::getattribute support for `limits:channels` and
  `limits:imagesize_MB`. #3617 (2.4.5/2.5.0.0)
* IBA::render_text and `oiiotool --text` now can find ".ttc" font files. #3633
  (2.5.0.0)
* Fix ImageOutput::check_open error conditions. #3769 (2.5.1.0)
* Fix thread safety issue when reading ICC profiles from multiple files
  simultaneously. This could affect any files with ICC profiles. #3767
  (2.5.1.0)
* Improve searching for fonts for the text rendering functionality. #3802
  #3803 (2.5.1.0)
* Improve OpenCV support -- errors, version, half
  [#3853](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3853)  (2.5.2.0)
* Prevent possible deadlock when reading files with wrong extensions
  [#3845](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3845) 
* Wait for terminated threads to join in thread_pool::Impl::resize [#3879](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3879) (by Ray Molenkamp)

### 🔧  Internals and developer goodies

* filesystem.h:
    - Add an optional size parameter to `read_text_file()` to limit the
      maximum size that will be allocated and read (default to a limit of
      16MB). New `read_text_from_command()` is similar to `read_text_file`,
      but reads from the console output of a shell command. #3635 (2.5.0.0)
    - New `Filesystem::is_executable()` and `find_program()`. #3638
      (2.4.6/2.5.0.0)
    - Change IOMemReader constructor to take a const buffer pointer. #3665
      (2.4.6/2.5.0.0)
    - IOMemReader::pread now detects and correctly handles out-of-range
      read positions. #3712 (2.4.7/2.5.0.0)
* fmath.h:
    - Fix a wrong result with `fast_exp2()` with MSVS and sse4.2.
      [#3804](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3804) (by Eric Mehl)
      (2.5.1.0/2.4.11)
    - Prevent infinite loop in bit_range_convert [#3996](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3996) (by Jesse Yurkovich) (2.5.3.2-rc1)
* platform.h:
    - New macros for detecting MSVS 2019 and 2022. #3727 (2.5.0.0/2.4.8.0)
* simd.h:
    - Fixes to ensure safe compilation for Cuda. #3810 (2.5.1.0/2.4.11)
    - Fix sense of hiding deprecated type names [#3870](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3870) (2.5.2.0)
    - Fix broken OIIO_NO_NEON definition [#3911](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3911)
* span.h:
    - `cspan<>` template now allows for Extent template argument (as `span<>`
      already did). #3685 (2.5.0.0)
    - New custom fmt formatter can print spans. #3685 (2.5.0.0)
* string_view.h:
    - Avoid sanitizer warning unsigned integer overflow [#3678](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3678)(by wayne-arnold-adsk)
* strutil.h:
    - Add a new flavor of `utf16_to_utf8()` to convert between std::u16string
      and std::string (UTF-8 encoded). Note the contrast between this and the
      existing flavor that takes a `std::wstring` with UTF-16 encoding
      (`std::wchar/wstring` is not guaranteed to 16 bits on all platforms, but
      `u16char/u16string` is). #3553 (2.5.0.0)
    - New `trimmed_whitspace()`. [#3636](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3636) (2.4.5/2.5.0.0)
    - Use std::forward properly for sync::print().
      [#3825](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3825)  (2.5.2.0)
    - Ensure proper constexpr of string hashing [#3901](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3901)
* timer.h:
    - Minor improvements to Timer and LoggedTimer classes. #3753 (2.5.0.1)
* tiffutils.h:
    - `decode_icc_profile` extracts several fields from an ICC profile binary
      blob and adds them as metadata to an ImageSpec. #3554 (2.5.0.0)
* typedesc.h:
    - Extend TypeDescFromC template to the full set of pixel types. #3726
      (2.5.0.0/2.4.8.0)
* ustring.h:
    - Make `std::hash` work for ustring, add `operator<` for ustringhash, add
      `from_hash()` to ustringhash, make ustringhash `==` and `!=` be
      constexpr for C++17 and beyond. #3577 (2.4.5/2.5.0.0)
    - Custom fmt formatter for ustringhash that prints the string rather than
      the hash. #3614 (2.4.5/2.5.0.0)
    - Ensure that ustring hashes are always 64 bits, even on 32-bit
      architectures. #3606 (2.5.0.0)
    - Ensure safe use of this header from Cuda. #3718 (2.4.7/2.5.0.0)
    - ustringhash: Make an explicit constructor from a hash value.
      [#3778](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3778) (2.4.9.0/2.5.1.0)
    - String literal operator for ustring and ustringhash
      [#3939](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3939) (2.5.3.0)
    - Fix Cuda warnings [#3978](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3978) (2.5.3.1-beta2)
* Safety: excise the last instances of unsafe sprintf. #3705 (2.5.0.0)
* Root out stray uses of deprecated simd type names; `OIIO_DISABLE_DEPRECATED`
  [#3830](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3830)  (2.5.2.0)
* Convert iconvert.cpp stream io and sprintf to modern [#3925](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3925)
* *oiiotool*: Refactor to get rid of the global Oiiotool singleton.
  [#3848](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3848) (2.5.2.0)

### 🏗  Build/test/CI and platform ports:

* CMake build system and scripts:
    - It is now possible to `-DOpenImageIO_VERSION` to override the version
      number being built (use with extreme caution). #3549 #3653 (2.5.0.0)
    - Perform parallel builds with MSVS. #3571 (2.5.0.0)
    - New CMake cache variable `FORTIFY_SOURCE`, if enabled, builds with the
      specified gcc `_FORTIFY_SOURCE` option defined. This  may be desirable
      for people deploying OIIO in security-sensitive environments. #3575
      (2.4.5/2.5.0.0)
    - CMake config should not include a find of fmt if it's internalized.
      #3739 (2.4.7.1/2.5.0.0)
    - New CMake cache variable `OIIO_DISABLE_BOOST_STACKTRACE` to disable the
      stacktrace functionality for users who want to avoid the Boost
      stacktrace library. #3777 (by jreichel-nvidia) (2.4.9.0/2.5.1.0)
    - Check need for libatomic with check_cxx_source_compiles instead of the
      more expensive check_cxx_source_runs. #3774 (2.4.9.0/2.5.1.0)
    - Fix incorrect CMake variable name to control symbol visibility
      [#3834](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3834)  (2.5.2.0)
    -  Make sure use of `${PROJECT_NAME}` doesn't occur before the call to
       `project()`. [#3651](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3651)
    - Fix use of OIIO_LOCAL_DEPS_PATH [#3865](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3865)
    - Added check for Boost_NO_BOOST_CMAKE, ignore if already set
      [#3961](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3961) (by Mikael Sundell) (2.5.3.0)
    - Remove unnecessary headers from strutil.cpp causing build trouble
      [#3976](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3976) (by Jesse Yurkovich) (2.5.3.1-beta2)
    - Print build-time warnings for LGPL gotchas
      [#3958](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3958) (by Danny Greenstein) (2.5.3.1-beta2)

* Dependency support:
    - Support for OpenColorIO 2.2. #3644 (2.5.0.0)
    - New CMake option `INTERNALIZE_FMT` (default ON), if set to OFF, will
      force OIIO clients to use the system fmt library and will not copy the
      necessary fmt headers into the OIIO include area. #3598 (2.4.7/2.5.0.0)
    - build_libtiff.bash changed to build shared library by default. #3586
      (2.5.0.0)
    - build_openexr.bash changed to build v3.1.5 by default. #3703 (by Michael Oliver) (2.5.0.0)
    - Qt6 support for iv. #3779 (2.4.9.0/2.5.1.0)
    - Fmt 10.0 support [#3836](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3836) (2.5.2.0)
    - FFmpeg 6.0 support [#3812](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3812)  (2.5.2.0)
    - Disable new warning for fmt headers in gcc13
      [#3827](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3827)  (2.5.2.0)
    - Raise minimum CMake dependency from 3.12 to 3.15 [#3924](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3924) (2.5.2.0)
    - Raise minimum libraw to 0.18 [#3921](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3921) (2.5.2.0)
    - Raise OpenEXR minimum from 2.3 to 2.4 [#3928](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3928) (2.5.2.0)
    - Fix WebP linking if CMAKE_FIND_PACKAGE_PREFER_CONFIG is ON [#3863](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3863) (by Benjamin Buch)
    - Find OpenEXR equally well with our FindOpenEXR and exr's exported config
      file [#3862](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3862) (by Benjamin
      Buch)
    - Fix fmt vs gcc warning that had version typo [#3874](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3874)
    - Fix broken libheif < 1.13 [#3970](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3970) (2.5.3.0)
    - Use exported targets for libjpeg-turbo and bump min to 2.1
      [#3987](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3987) (2.5.3.1-beta2)
* Testing and Continuous integration (CI) systems:
    - Restored sanitizer tests which had been inadvertently disabled. #3545
      (2.5.0.0)
    - Added tests for undefined behavior sanitizer. #3565 (2.5.0.0)
    - Added tests or improved test coverage for Cineon files #3607, iinfo
      #3605 #3613 #3688 #3706, texture statistics #3612, oiiotool unit tests
      #3616, oiiotool expression substitution #3636, various oiiotool #3626
      #3637 #3643 #3649, oiiotool control flow #3643, oiiotool sequence errors
      and selecting out of range subimages or mip levels #3649, Strutil
      functionality #3655, ImageCache #3654, environment mapping #3694,
      texture3d #3699, term output #3714, igrep #3715, oiiotool --pdiff #3723,
      zover, fixnan for deep images, 2D filters #3730, pbm files #3731, maketx
      --lightprobe #3732 (2.5.0.0), TypeDesc::tostring, python ImageCache and
      ImageBuf #3745, maketx #3748 (2.5.0.1), ImageBufAlgo python functions
      #3766 (2.5.1.0), etc. #3745
    - Make testsuite/oiiotool-control run much faster by combining commands
      into fewer oiiotool invocations (speeds up testsuite) #3618 (2.5.0.0)
    - CI color related tests use the OCIO buit-in configs, when OCIO 2.2+ is
      available. #3662 (2.5.0.0)
    - Fix compiler warnings [#3833](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3833)  (2.5.2.0)
    - Fix package name for icc [#3860](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3860)  (2.5.2.0)
    - Change the few symbolic links to copies to help Windows
      [#3818](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3818)  (2.5.2.0)
    - Fix incorrect branch name when cloning openexr-images for the tests
      [#3814](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3814)  (2.5.2.0) (by
      Jesse Y) 
    - Sonar analysis should exclude stb_sprintf.h [#3609](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3609)
    - Eliminate xxhash and farmhash code from coverage analysis [#3621](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3621)
    - No longer add the ppa:ubuntu-toolchain-r/test repository [#3671](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3671)
    - Test against latest webp, and deal with its master->main repo change [#3695](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3695)
    - Fix broken Mac CI with proper numpy install [#3702](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3702)
    - Lock down to older icc so it's not broken [#3744](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3744)
    - Updates to runners, dependencies [#3786](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3786)
    - Bump 'latest versions' test to the newest openexr release [#3796](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3796)
    - Fix broken heif dependency and test [#3894](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3894)
    - Add test with new aswf containers for VFX Platform 2023 [#3875](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3875)
    - Simplify build_llvm.bash script [#3892](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3892)
    - Get rid of long-unused install_test_images.bash [#3895](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3895)
    - Test against pybind11 v2.11 [#3912](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3912)
    - Lock down icx version [#3929](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3929)
    - Fix missing simd test due to copy paste typo [#3896](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3896)
    - Bump build_openexr and build_opencolorio defaults to latest versions [#3920](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3920)
    - Test both openexr old and core versions [#3604](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3604)
    - Add benchmarking of strutil.h ways to concatenate strings. [#3787](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3787)
    - Make timer_test more robust [#3953](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3953) (2.5.3.0)
    - Tests for ABI compliance [#3983](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3983), [#3988](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3988) (2.5.3.1-beta2)
* Platform support:
    - Windows: protect against OpenEXR thread deadlock on shutdown. #3582
      (2.4.5/2.5.0.0)
    - Windows: Work around a static destruction order issue. #3591
      (2.4.5/2.5.0.0)
    - Windows: define `NOGDI` to keep the inclusion of windows.h from adding
      as many unneeded symbols. [#3596](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3596) (by Aras Pranckevičius) (2.4.5/2.5.0.0)
    - Windows: Stop including Windows.h from public OIIO headers. [#3597](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3597) (by Aras Pranckevičius) (2.5.0.0)
    - Windows: Fix windows.h pre-definitions
      [#3965](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3965) (2.5.3.0)
    - Windows on ARM64 build fixes. #3690 (2.4.6/2.5.0.0)
    - Windows: Fix unresolved external symbol for MSVS 2017.
      [#3763](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3763) (by Latios96) (2.5.0.1)
    - Windows: Fix build error with MSVC [#3832](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3832)  (by Ray Molenkamp)  (2.5.2.0)
    - MinGW: fix incorrect symbol visibility issue for ImageBuf iterators. #3578
    - Mac: Suppress warnings about deprecated std::codecvt on newest Apple
      clang. #3709 #3710 (2.4.7/2.5.0.0)
    - Mac: Fixes to make a clean build using Apple Clang 11.0.
      [#3795](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3795) (by johnfea) (2.4.10.0/2.5.1.0)
    - Mac: Fixes for latest xcode on MacOS 13.3 Ventura [#3854](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3854)  (2.5.2.0)
    - Mac: Suppress Xcode warnings [#3940](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3940) (by Anton Dukhovnikov) (2.5.3.0)
      #3722 (2.4.7/2.5.0.0)
    - Mac: Fixes for latest xcode on MacOS 13.3 Ventura [#3854](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3854)  (2.5.2.0)
    - Fixes to make a clean build on Mac using Apple Clang 11.0.
    - ARM: Fix signed/unsigned mismatch compiler errors in vbool4 methods.
    - ARM: improve SIMD operations for ARM NEON. #3599 (2.4.5/2.5.0.0)
    - ARM: Fix signed/unsigned mismatch compiler errors in vbool4 methods.
    - ARM Mac: Fix build break. #3735 (2.5.0.0/2.4.7.1)
    - Fixes to build properly on OpenBSD. [#3808](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3808) (by Brad Smith) (2.5.1.0/2.4.11)
    - Squash warning in gcc 12.1 + C++20 [#3679](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3679)
    - Work around problems with fmt library + NVPTX relating to unknown
      float128 type. [#3823](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3823)
      (by Edoardo Dominici)
    - Silence gcc new/delete warnings for texturesys [#3944](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3944) (by Shootfast) (2.5.3.0)

### 📚  Notable documentation changes:

- Docs: Better Windows build instructions in INSTALL.md. [#3602](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3602) (by Aras Pranckevičius) (2.4.5/2.5.0.0)
- ImageInput and ImageOutput docs updated to Python 3. [#3866](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3866) (by Ziggy Cross)
- Fix explanation of raw:Exposure config hint [#3889](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3889)
- Many fixes to python code examples [#3869](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3869) (by Jesse Y)
- Update ImageInput docs to not use deprecated APIs [#3907](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3907) (by Jesse Y)
- New initiative where we are (bit by bit) ensuring that all code examples in
  the documentation are tested in the testsuite and can therefore never be
  incorrect nor out of date with the evolution of the APIs.
  [#3977](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3977)
  [#3994](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3994) (2.5.3.1-beta2)
- Spruce up the main README and add "Building_the_docs"
  [#3991](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3991) (2.5.3.1-beta2)

### 🏢  Project Administration

- **Moved repo to https://github.com/AcademySoftwareFundation/OpenImageIO**.
  Also moved the "oiio-images" repo to AcademySoftareFoundation/OpenImageIO
- Added RELEASING.md documenting our versioning and release procedures #3564
#3580
- Update CONTRIBUTING and SECURITY [#3852](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3852)  (2.5.2.0)
- Update mail list to https://lists.aswf.io/g/oiio-dev [#3880](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3880)
- Add charter and other ASWF documents to the repo [#3850](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3850)
- Document use of the DCO which is now required for all PRs [#3897](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3897)
- Put logo on the main readme [#3927](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3927)
- Remove old CLAs that are no longer in effect
- Change open source license to Apache 2.0. #3899, #3903, #3904, #3906, #3914,
  #3922, #3926, #3938, #3966, #3989.
- Make sure README has links for slack and meetings [#3936](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3936)
- Update pull request and issue templates [#3946](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3946)
- Add Jesse Yurkovich to the TSC [#3937](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3937)



Release 2.4.16.0 (1 Oct 2023) -- compared to 2.4.15.0
-------------------------------------------------------
- *png*: Write out proper tiff header version in png EXIF blobs [#3984](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3984) (by Jesse Yurkovich)
- *ustring*: Fix Cuda warnings [#3978](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3978)
- *fmath*: Prevent infinite loop in bit_range_convert [#3996](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3996) (by Jesse Yurkovich)
- *build*: Fixes to work properly with fmt 10.1 (partial port of #3973)
- *admin*: Relicense code under Apache 2.0 [#3989](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3989)


Release 2.4.15.0 (1 Sep 2023) -- compared to 2.4.14.0
-------------------------------------------------------
- *bmp*: Fix signed integer overflow when computing total number of pixels. Fixes CVE-2023-42295. [#3948](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3948)  (by xiaoxiaoafeifei)
- *dds*: Fix div by 0 during DXT4 DDS load [#3959](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3959)  (by Jesse Yurkovich)
- *rla*: Invalid read from an empty vector during RLA load [#3960](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3960)  (by Jesse Yurkovich)
- *fix*:  Various protections against corrupted files [#3954](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3954)
- *fix*: Improve Utf-8 text rendering [#3935](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3935)  (by Nicolas)
- *fix*: Fix typo in debug output [#3956](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3956)  (by Jesse Yurkovich)
- *ustring.h*: String literal operator for ustring and ustringhash [#3939](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3939)
- *build* Suppress Xcode warnings [#3940](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3940)  (by Anton Dukhovnikov)
- *build*: Silence gcc new/delete warnings for texturesys [#3944](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3944)  (by Shootfast)
- *build* Added check for Boost_NO_BOOST_CMAKE, ignore if already set [#3961](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3961)  (by Mikael Sundell)
- *build* Fix broken libheif < 1.13 [#3970](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3970)
- *ci*: Make more robust timer_test [#3953](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3953)
- *admin* Relicense code under Apache 2.0 [#3938](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3938) [#3966](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3966)

Release 2.4.14.0 (1 Aug 2023) -- compared to 2.4.13.0
-------------------------------------------------------
- *ico*: IOProxy support for ICO input [#3919](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3919) (by jasonbaumeister)
- *fix(psd)*: CMYK PSD files now copy alpha correctly [#3918](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3918) (by jasonbaumeister)
- *fix(python)*: Fix arithmetic overflow in oiio_bufinfo (Python interop) [#3931](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3931) (by Jesse Yurkovich)
- *build*: Fix WebP linking if CMAKE_FIND_PACKAGE_PREFER_CONFIG is ON
  [#3863](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3863) (by Benjamin Buch)
- *build*: Find OpenEXR equally well with our FindOpenEXR and exr's exported
  config file [#3862](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3862) (by Benjamin Buch)
- *build*: Fix broken OIIO_NO_NEON definition [#3911](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3911)
- *ci*: Lock down icx version [#3929](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3929)
- *ci*: Bump build_openexr and build_opencolorio defaults to latest versions [#3920](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3920)
- *admin*: Update mail list to https://lists.aswf.io/g/oiio-dev
  [#3880](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3880)
- *admin*: Add charter and other ASWF documents to the repo
  [#3850](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3850)
- *admin*: Document use of the DCO which is now required for all PRs
  [#3897](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3897)
- *admin*: Put logo on the main readme
  [#3927](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3927)
- *admin*: Remove old CLAs that are no longer in effect
- *admin*: Change open source license to Apache 2.0. #3899, #3903, #3904,
  #3906, #3914, #3922, #3926.

Release 2.4.13.0 (1 July 2023) -- compared to 2.4.12.0
-------------------------------------------------------
- *OpenCV*: Improve OpenCV support -- errors, version, half [#3853](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3853)
- *IBA*: Improve error message for IBA::ocio functions [#3887](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3887)
- *exif*: Convert paramvalue string to integer when needed [#3886](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3886) (by Fabien Servant @ TCS)
- *exr*: Correction to dwa vs zip logic when outputting OpenEXR [#3884](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3884)
- *ico*: Heap-buffer-overflow [#3872](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3872) (by xiaoxiaoafeifei) Fixes CVE-2023-36183.
- *jpeg*: Fix density calculation  for jpeg output [#3861](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3861) (by Loïc Vital)
- *jpeg2000*: Better pixel type promotion logic [#3878](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3878)
- *psd*: Prevent simultaneous psd thumbnail reads from clashing [#3877](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3877)
- *strutil.h*: Ensure proper constexpr of string hashing [#3901](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3901)
- *build* Fix use of OIIO_LOCAL_DEPS_PATH [#3865](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3865)
- *build* Fix fmt vs gcc warning that had version typo [#3874](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3874)
- *ci*: Add test with new aswf containers for VFX Platform 2023 [#3875](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3875)
- *ci*: Fix broken heif dependency and test [#3894](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3894)
- *ci*: Simplify build_llvm.bash script [#3892](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3892)
- *tests*: Fix missing simd test due to copy paste typo [#3896](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3896)
- *docs*: Update CONTRIBUTING and SECURITY [#3852](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3852)
- *docs*: ImageInput and ImageOutput docs updated to Python 3. [#3866](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3866) (by Ziggy Cross)
- *docs*: Many fixes to python code examples [#3869](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3869) (by Jesse Y)
- *docs*: Update mail list URL [#3880](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3880)
- *docs*: Fix explanation of raw:Exposure config hint [#3889](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3889)
- *docs*: Document use of the DCO which is now required for all PRs [#3897](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3897)

Release 2.4.12.0 (1 June 2023) -- compared to 2.4.11.1
------------------------------------------------------
- *oiiotool*: Don't propagate unsupported channels [#3838](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3838)
- *oiiotool*: Improvements to performance and memory when making very large textures [#3829](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3829)
- *fix*: Prevent possible deadlock when reading files with wrong extensions [#3845](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3845)
- *gif*: Prevent possible heap buffer overflow [#3841](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3841)  (by xiaoxiaoafeifei)
- *psd*: Improve memory efficiency of PSD read [#3807](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3807)
- *raw*: Fix LibRaw flip to Exif orientation conversion [#3847](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3847)  (by Loïc Vital)
- *raw*: Raw input fix user_flip usage [#3858](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3858)  (by Loïc Vital)
- *strutil*: Use forward properly for sync::print(). [#3825](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3825)
- *build*: Fixes for latest xcode on MacOS 13.3 Ventura [#3854](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3854)
- *build*: Fix build error with MSVC [#3832](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3832)  (by Ray Molenkamp)
- *ci*: Fix warnings [#3833](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3833)
- *ci*: Fix package name for icc [#3860](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3860)

Release 2.4.11.1 (14 May 2023) -- compared to 2.4.11.0
------------------------------------------------------
- *build*: Fmt 10.0 support [#3836](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3836)

Release 2.4.11.0 (1 May 2023) -- compared to 2.4.10.0
------------------------------------------------------
* oiiotool: For expression evaluation, `NIMAGES` now evaluates to the current
  image stack depth. #3822
* Python: Improve error messages when passing wrong python array sizes. #3801
* Raw: handle 1-channel raw images. #3798
* HEIC: Support the ".hif" extension, which seems to be used by some Canon
  cameras instead of .heif. [#3813](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3813)(by AdamMainsTL)
* PSD: Fix problems reading images with width > 64k pixels. #3806
* Windows/fmath: Work around MSVS bug(?) that generated wrong code for
  fast_exp2. #3804
* Build: Fix building on OpenBSD. #3808
* Build: Refactor simd.h to disable Intel intrinsics when not on Intel
  (including Cuda compiles). #3814
* Build: Fix building against new ffmpeg 6.0. #3812
* Build: Work around problems with fmt library + NVPTX relating to unknown
  float128 type. [#3823](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3823) (by Edoardo Dominici)
* CI/test: Fix incorrect branch name when cloning openexr-images for the
  testsuite. #3814
* Test: Use copies instead of symlinks in a couple spots to help on Windows.
  #3818

Release 2.4.10.0 (1 Apr 2023) -- compared to 2.4.9.0
-----------------------------------------------------
* Exif: Fix typo that prevented us from correctly naming Exif
  "CameraElevationAngle" metadata. #3783
* IC/TS: Fixes that avoid deadlock situations on the file handle cache
  in certain scenarios with very high thread contention. #3784
* Docs: Some retroactive edits to INSTALL.md to correctly document changed
  dependencies of the 2.4 series.
* GIF: Fix potential array overrun when writing GIF files. #3789
* Build: Fixes to make a clean build on Mac using Apple Clang 11.0. #3795
* FYI: This version of OIIO should build against Clang 16.
* maketx: Fix a broken --cdf flag, which was set up to take an argument, but
  should always simply have acted as a simple boolean flag on its own. The
  incorrect way it was set up not only was useless, but also could lead to
  occasional crashes. #3748
* maketx and oiiotool --otex: Add support for CDFs of bumpslopes channels.
  Previously, if you used both --bumpslopes and --cdf at the same time, the
  CDFs were not produced for all channels. #3793

Release 2.4.9.0 (1 Mar 2023) -- compared to 2.4.8.1
-----------------------------------------------------
* Build: check need for libatomic with check_cxx_source_compiles instead of
  the more expensive check_cxx_source_runs. #3774
* Fix(IC): Avoid bad IC stats when no files were read. #3765
* Build: Add a cmake option OIIO_DISABLE_BOOST_STACKTRACE to disable use and
  dependency of boost stacktrace. #3777
* ustringhash: Make an explicit constructor from a hash value. #3778
* Build: Add ability to build against Qt6. #3779

Release 2.4.8.1 (13 Feb 2023) -- compared to 2.4.8.0
-----------------------------------------------------
* Fix(targa): guard against corrupted tga files Fixes TALOS-2023-1707 /
  CVE-2023-24473, TALOS-2023-1708 / CVE-2023-22845. #3768
* Fix: race condition in TIFF reader, fixes TALOS-2023-1709 / CVE-2023-24472.
  #3772
* Windows: Fix unresolved external symbol for MSVS 2017 #3763
* Fix: Initialize OpenEXROutput::m_levelmode() in init(). #3764
* Fix: improve thread safety for concurrent tiff loads. #3767
* Fix(fits): Make sure to close if open fails to find right magic number.
  #3771

Release 2.4.8.0 (1 Feb 2023) -- compared to 2.4.7.1
----------------------------------------------------
* oiiotool --pdiff: test, be sure to count it as making output. #3723
* IBAprep should not zero out deep images when creating dst #3724
* PBM: Fix for incorrect inverting of 1-bit pbm images. #3731
* New `ImageSpec:set_colorspace()` sets color space metadata in a consistent
  way. #3734
* BMP: set colorspace to sRGB #3701
* PNG: Add EXIF support when writing PNG files. #3735
* PSD: Fix wrong oiio:UnassociatedAlpha metadata for PSD files. #3750
* platform.h: set up macros for detecting MSVS 2019 and 2022 #3727
* typedesc.h: Extend TypeDescFromC template to the full set of pixel types
  #3726
* Testing: many improvements for testing and code coverage. #3730 #3654 #3694
  #3699 #3732 #3741 #3745 #3747
* Testing: Fix long-broken ref images for texture-icwrite test #3733
* Docs: Updated RTD docmentation style, looks much nicer. #3737
* Docs: improve description of ociodisplay and others.
* Docs: Fix old release notes to document all CVEs addressed in certain
  prior releases.

Release 2.4.7.1 (3 Jan 2023) -- compared to 2.4.7.0
----------------------------------------------------
* Fix build break for Mac ARM. #3735
* CMake config should not include a find of fmt if it's internalized. #3739

Release 2.4.7.0 (1 Jan 2023) -- compared to 2.4.6.0
----------------------------------------------------
* IOMemReader detects and errors for out-of-range read positions. #3712
* Build/Mac: Suppress some deprecation warnings when building wth the newest
  Apple clang. #3709 #3710
* ARM: Fix signed/unsigned SIMD mismatch in vbool4::load. #3722
* Build: New CMake variable `INTERNALIZE_FMT`, when set to OFF will ensure
  that the fmt headers are not internalized (copied to the installed part
  of OIIO). The default is ON, matching old behavior. #3598
* Testing: Improved testing of iinfo #3688 #3706, 'term' output #3714, igrep
  #3715.
* build_openexr.bash: bump default version of OpenEXR/Imath retrieved to be
  3.1.5. #3703
* span.h: Make sure the cspan alias also allows the Extent template
  argument; add a custom formatter to print spans. #3685
* ustring.h: `#if` guards to let the header be Cuda-safe. #3718
* Internals: refactoring to remove duplicated code for iinfo and
  `oiiotool --info`. #3688
* Internals: remove the last instances of unsafe std::sprintf. #3705

Release 2.4.6 (1 Dec 2022) -- compared to 2.4.5.0
---------------------------------------------------
* make_texture / maketx : ensure proper setting of certain metadata when
  using a texture as a source to build another texture. #3634
* Build: Make sure use of `${PROJECT_NAME}` doesn't occur before the call to
  `project()`. #3651
* Fix null pointer dereference when OCIO no configuration is found. #3652
* Support for building against OpenColorIO 2.2. #3662
* Fixes to subtle bugs when ImageBuf is used with IOProxy. #3666
* oiiotool: Fix problems with `--point` when there is no alpha channel. #3684
* oiiotool: `--dumpdata` fix channel name output. #3687
* BMP: Fix possible write errors, fixes TALOS-2022-1653 / CVE-2022-43594,
  CVE-2022-43595. #3673
* DPX: Fix possible write errors, fixes TALOS-2022-1651 / CVE-2022-43592 and
  TALOS-2022-1652 / CVE-2022-43593. #3672
* IFF files: Add IOProxy support. #3647
* IFF: Fix possible write errors, fixes TALOS-2022-1654 / CVE-2022-43596,
  TALOS-2022-1655 / CVE-2022-43597 CVE-2022-43598, TALOS-2022-1656 /
  CVE-2022-43599 CVE-2022-43600 CVE-2022-43601 CVE-2022-43602
  [#3676](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3676)
* PSD: Fix thumbnail extraction. #3668
* PSD: when reading, don't reject padded thumbnails. [#3677](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3677)
* Raw: Update Exif orientation if user flip is set. #3669
* Zfile write safety, fixes TALOS-2022-1657 / CVE-2022-43603. #3670
* filesystem.h: new `Filesystem::is_executable()` and `find_program()`. #3638
* filesystem.h: Change IOMemReader constructor to take a const buffer
  pointer. #3665
* strutil.h: new `trimmed_whitspace()`. #3636
* New `OIIO::print()` exposes `Strutil::print()` in the main OIIO namespace.
  #3667
* Testing: improved testing of oiiotool #3637 #3643 #3649, Strutil #3655

Release 2.4.5 (1 Nov 2022) -- compared to 2.4.4.2
---------------------------------------------------
* oiiotool: new commands `--iccread`  reads a named file and adds its contents
  as the ICCProfile metadata of the top image, `--iccwrite` saves the
  ICCProfile metadata of the top file to a named file. #3550
* TIFF, JPEG, JPEG-2000, PNG, and PSD files containing ICC profiles now
  extract and report extra metadata related to aspects of those profiles.
  #3554
* Python: support `int8[]` metadata and retrieving the `ICCPorofile` metadata.
  #3556
* oiiotool: New expression syntax for retrieving metadata `{TOP[foo]}` is
  similar to the existing `{TOP.foo}`, if there is no `foo` metadata found,
  the former evaluates to an empty string, whereas the latter is an error.
  #3619
* Strutil: new `utf16_to_utf8(const std::u16string&)` and
  `Strutil::utf8_to_utf16wstring()`. #3553
* ustring: make `std::hash` work for ustring, add `operator<` for ustringhash,
  add `from_hash()` to ustringhash, make ustringhash `==` and `!=` be
  constexpr for C++17 and beyond. #3577  Custom fmt formatter for ustringhash
  that prints the string rather than the hash. #3614
* Build: the version number is now a CMake cache variable that can be
  overridden (caveat emptor). #3549
* Build/security: New CMake cache variable `FORTIFY_SOURCE`, if enabled,
  builds with the specified gcc `_FORTIFY_SOURCE` option defined. This may be
  desirable for people deploying OIIO in security-sensitive environments.
  #3575
* CI: testing now includes using undefined behavior sanitizer. #3565
* Windows: protect against OpenEXR thread deadlock on shutdown. #3582
* Windows: Work around a static destruction order issue. #3591
* Windows: define `NOGDI` to keep the inclusion of windows.h from adding as
  many unneeded symbols. #3596
* MinGW: fix incorrect symbol visibility issue for ImageBuf iterators. #3578
* ARM: improve SIMD operations for ARM NEON. #3599
* Docs: New RELEASING.md documents our releasing procedures. #3564 #3580
* Docs: Better Windows build instructions in INSTALL.md. #3602
* Fix missing OIIO::getattribute support for `limits:channels` and
  `limits:imagesize_MB`. #3617
* BMP: fix reading 16bpp images. #3592
* BMP: protect against corrupt pixel coordinates. (TALOS-2022-1630,
  CVE-2022-38143) #3620
* DDS: fix alpha/luminance files, better testing. #3581
* DDS: optimize loading of compressed images, improves 3-5x. #3583 #3584
* DDS: Fix crashes for cubemap files when a cube face was not present, and
  check for invalid bits per pixel. (TALOS-2022-1634, CVE-2022-41838)
  (TALOS-2022-1635, CVE-2022-41999) #3625
* HDR: fix a 8x (!) read performance regression for HDR files that was
  introduced in OIIO in 2.4. #3588  On top of that, speed up by another 4x
  beyond what we ever did before by speeding up the RGBE->float conversion.
  #3590
* PNG: fix memory leaks when errors take an early exit. #3543 #3544
* PSD: fix a PSD read error on ARM architecture. #3589
* PSD: protect against corrupted embedded thumbnails. (TALOS-2022-1626,
  CVE-2022-41794) #3629
* RAW: additional color metadata is now recognized: `pre_mul`, `cam_mul`,
  `cam_xyz`, `rgb_cam`. #3561 #3569 #3572
* RLA: fix potential buffer overrun. (TALOS-2022-1629, CVE-2022-36354) #3624
* Targa: string overflow safety. (TALOS-2022-1628, CVE-2022-41981) #3622
* TIFF/JPEG/PSD: Fix EXIF bugs where corrupted exif blocks could overrun
  memory. (TALOS-2022-1626, CVE-2022-41794) (TALOS-2022-1631, CVE-2022-41649)
  (TALOS-2022-1632, CVE-2022-41684) (TALOS-2022-1636 CVE-2022-41837) #3627
* TIFF: guard against corrupt files with buffer overflows. (TALOS-2022-1627,
  CVE-2022-41977) #3628
* TIFF: guard against buffer overflow for certain CMYK files.
  (TALOS-2022-1633, CVE-2022-41639) (TALOS-2022-1643, CVE-2022-41988) #3632

Release 2.4.4.2 (3 Oct 2022) -- compared to 2.4.4.1
---------------------------------------------------
* DDS: Improved support for DTX5, ATI2/BC5 normal maps, R10G10B10A2
  format, RXGB, BC4U, BC5U, A8, improved low bit expansion to 8 bits.
  #3573 (2.4.4.2)
* DDS: Fix possible heap overflow on input. #3542 (2.4.4.2)

Release 2.4 (1 Oct 2022) -- compared to 2.3
----------------------------------------------
New minimum dependencies and compatibility changes:
* OpenEXR minimum is now 2.3 (raised from 2.0). #3109 (2.4.0)
* Field3D support has been removed entirely. The Field3D library appears to be
  no longer maintained, and is incompatible with modern versions of
  OpenEXR/Imath. We believe that all prior uses of Field3D use via OIIO have
  been migrated to OpenVDB. #3151 (2.4.0)

New major features and public API changes:
* Imath header and class hiding:
    - Header includes have been shuffled around so that Imath headers are not
      included from OIIO headers where they are not needed, and some OIIO
      headers that need Imath types only for few function parameters now guard
      those functions with `#if` so that Imath-taking functions are not
      visible unless the calling app has previously had an `#include` of
      Imath. If your app uses Imath types but did not include the right Imath
      headers (relying on the accidental fact of other OIIO headers
      transitively including them), you may need to adjust your includes.
      #3301 #3332 (2.4.0.2) #3406 #3474 (2.4.2)
    - New `V3fParam`, `M33fParam`, and `M44fParam` (defined in vecparam.h) are
      used just for parameter passing in public APIs, instead of Imath::V3f,
      M33f, or M44f, in order to more fully hide Imath types from our public
      interfaces. These are only parameter-passing classes, and are not useful
      as vector or matrix classes in their own right. But they seamlessly cast
      to and from other vector- and matrix-like classes. #3330 (2.4.1.0)
    - `OPENIMAGEIO_IMATH_DEPENDENCY_VISIBILITY` is a new CMake cache variable
      at OIIO build time that controls whether the Imath library dependencies
      will be declared as PUBLIC (default) or PRIVATE target dependencies of
      libOpenImageIO and libOpenImageIO_Util. #3322 (4.2.0.2) #3339 (4.2.0.3)
    - For *downstream projects* that consume OIIO's exported cmake config
      files, setting CMake variable `OPENIMAGEIO_CONFIG_DO_NOT_FIND_IMATH` to
      ON will skip the find_depencency() calls for Imath and OpenEXR. To
      clarify, this is not a variable that has any effect when building OIIO,
      it's something set in the downstream project itself.  #3322 (4.2.0.2)
* The dithering that happens when saving high bit depth image data to low bit
  depth formats has been improved in several ways. It now applies when writing
  >8 bit data to <= 8 bit files, not just when the source is float or half.
  The dither pattern is now based on blue noise, and this dramatically
  improves the visual appearance. #3141 (2.4.0/2.3.10)
* TextureSystem now supports stochastic sampling. If the new TextureOpt field
  `rnd` (which now defaults to -1.0) is set to a value >= 0, the filtered
  texture lookup can use stochastic sampling to save work. The shading system
  attribute "stochastic" is set to the stochastic strategy: 0 = no stochastic
  sampling; 1 = for trilinear or anisotropic MIP modes, choose one MIP level
  stochastically instead of blending between two levels; 2 = for anisotropic
  mode, use just one anisotropic sample, chosen across the filter axis. (This
  is a bit field, so 3 combines both strategies.) We measure this speeding up
  texture lookups by 25-40%, though with more visual noise (which should be
  resolved cleanly by a renderer that uses many samples per pixel). This
  should only used for texture lookups where many samples per pixel will be
  combined, such as for surface or light shading. It should not be used for
  texture lookups that must return a single correct value (such as for
  displacement, when each grid position is sampled only once). Even when the
  "stochastic" attribute is nonzero, any individual texture call may be made
  non-stochastic by setting TextureOpt.rnd to a negative value. #3127
  (2.4.0/2.3.10) #3457 (2.4.2)
* maketx/make_texture() now supports options to store Gaussian forward and
  inverse transform lookup tables in image metadata (must be OpenEXR textures
  for this to work) to aid writing shaders that use histogram-preserving
  blending of texture tiling. This is controlled by new maketx arguments
  `--cdf`, `--cdfsigma`, `--sdfbits`, or for `IBA::make_texture()` by using
  hints `maketx:cdf`, `maketx:cdfsigma`, and `maketx:cdfbits`. #3159 #3206
  (2.4.0/2.3.10)
* oiiotool new commands and features:
    - Control flow via `--if`, `--else`, `--endif`, `--while`, `--endwhile`,
      `--for`, `--endfor` let you prototypes conditional execution and loops
      in the command sequence. #3242 (2.4.0)
    - `--set` can set variables and their values can be retrieved in
      expressions. #3242 (2.4.0)
    - Expressions now support: numerical comparisons via `<`, `>`, `<=`, `>=`,
       `==`, `!=`, `<=>`; logical operators `&&`, `||`, `!`, `not()`; string
       comparison functions `eq(a,b)` and `neq()`. #3242 #3243 (2.4.0)
    - `--oiioattrib` can set "global" OIIO control attributes for an oiiotool
      run (equivalent of calling `OIIO::attribute()`). #3171 (2.4.0/2.3.10)
    - `--repremult` exposes the previously existing `IBA::repremult()`. The
      guidance here is that `--premult` should be used for one-time conversion
      of "unassociated alpha/unpremultiplied color" to
      associated/premultiplied, but when you are starting with a premultiplied
      image and have a sequence of unpremultiply, doing some adjustment in
      unpremultiplied space, then re-premultiplying, it's `--repremult` you
      want as the last step, because it preserves alpha = 0, color > 0 data
      without crushing it to black. #3192 (2.4.0/2.3.10)
    - `--saturate` can adjust saturation level of a color image. #3190
      (2.4.0/2.3.10)
    - `--maxchan` and `--minchan` turn an N-channel image into a 1-channel
      images that for each pixel, contains the maximum value in any channel of
      the original for that pixel. #3198 (2.4.0/2.3.10)
    - `--point` lets you color one or more pixels in an image (analogous to
      IBA::render_point). #3256 (2.4.0)
    - `--warp` now takes an optional modifier `:wrap=...` that lets you set
      which wrap mode to use when sampling past the edge of the source image.
      #3341 (2.4.0.3)
    - New `--st_warp` performs warping of an image where a second image gives
      the (s,t) coordinates to look up from at every pixel. #3379
      (2.4.2/2.3.14)
    - Many attribute actions now take optional modifier `:subimages=` that
      instructs oiiotool to apply to a particular subset of subimges in
      multi-subimage files (such as multi-part exr). The commands so enabled
      include `--attrib`, `--sattrib`, `--eraseattrib`, `--caption`,
      `--orientation`, `--clear-keywords`, `--iscolorspace`. The default, if
      subimages are not specified, is to only change the attributes of the
      first subimage, unless `-a` is used, in which case the default is to
      change the attributes of all subimages. #3384 (2.4.2)
* ImageSpec :
    - New constructors to accept a string for the data type. #3245
      (2.4.0/2.3.12)
* ImageBuf/ImageBufAlgo :
    - `IBA::saturate()` can adjust saturation level of a color image. #3190
      (2.4.0/2.3.10)
    - `IBA::maxchan()` and `minchan()` turn an N-channel image into a
      1-channel images that for each pixel, contains the maximum value in any
      channel of the original for that pixel. #3198 (2.4.0/2.3.10)
    - New `IBA::st_warp()` performs warping of an image where a second image
      gives the (s,t) coordinates to look up from at every pixel. #3379
      (2.4.2/2.3.14)
    - `IBA::bluenoise_image()` returns a reference to a periodic blue noise
      image. #3141 #3254 (2.4.0/2.3.10)
* ImageCache / TextureSystem :
    - IC/TS both have added a `getattributetype()` method, which retrieves
      just the type of a named attribute. #3559 (2.4.4.0)
* Python bindings:
    - New ImageBuf constructor and reset() from a NumPy array only -- it
      deduces the resolution, channels, and data type from the array
      dimensions and type. #3246 (2.4.0/2.3.12)
    - ROI now has a working `copy()` method. #3253 (2.4.0/2.3.12)
    - ImageSpec and ParamValueList now support `'key' in spec`, `del
      spec['key']`, and `spec.get('key', defaultval)` to more fully emulate
      Python `dict` syntax for manipulating metadata. #3252 (2.3.12/2.4.0)
    - Support uint8 array attributes in and out. This enables the proper
      Python access to "ICCProfile" metadata. #3378 (2.4.1.0/2.3.14)
    - New `ImageSpec.get_bytes_attribute()` method is for string attributes,
      but in Python3, skips decoding the underlying C string as UTF-8 and
      returns a `bytes` object containing the raw byte string. #3396 (2.4.2)
    - Fixes for Python 3.8+ to ensure that it can find the OpenImageIO module
      as long as it's somewhere in the PATH. This behavior can be disabled by
      setting environment variable `OIIO_LOAD_DLLS_FROM_PATH=0`. #3470
      (2.4.0/2.3.18)
* New global OIIO attributes:
    - `"try_all_readers"` can be set to 0 if you want to override the default
      behavior and specifically NOT try any format readers that don't match
      the file extension of an input image (usually, it will try that one
      first, but it if fails to open the file, all known file readers will be
      tried in case the file is just misnamed, but sometimes you don't want it
      to do that). #3172  (2.4.0/2.3.10)
    - `"use_tbb"` if nonzero, and if OIIO was built with TBB enabled and
      found, then will use the TBB thread pool instead of the OIIO internal
      thread pool. #3473 (2.4.2.2)
    - `"version"` (read only) now retrieves the version string. #3534
      (2.3.19.0/2.4.2.2)
* Full IOProxy support has been added to TIFF #3075 (2.4.0/2.3.8), JPEG, GIF
  #3181 #3182 (2.4.0/2.3.10), DDS #3217, PNM #3219, PSD #3220, Targa #3221,
  WebP #3224, BMP #3223, JPEG-2000 #3226 (2.4.0).
* Convention change: Image readers who wish to convey that the color space of
  an input image is a simple gamma-corrected space will now call the color
  space "GammaX.Y" (previously we sometimes used this, but sometimes called it
  "GammaCorrectedX.Y"). #3202 (2.4.0)
* `oiioversion.h` now defines symbols `OIIO_USING_IMATH_VERSION_MAJOR` and
  `OIIO_USING_IMATH_VERSION_MINOR` that reveal which Imath version was used
  internally to OIIO when it was built (which may be different than the
  version found when the downstream app is being compiled). #3305 (2.4.0.1)
* Most of the major APIs (including ImageInput, ImageOutput, and ImageBuf)
  that took a std::string or string_view to indicate a filename (assumed to
  support UTF-8 encoding of Unicode filenames) now have additional versions
  that directly take a `std::wstring`, thus supporting UTF-16 Unicode
  filenames as "wide strings". #3312 #3318 (2.4.0.1)
* The ColorConfig API adds new calls `getDisplayViewColorSpaceName()` and
  `getDisplayViewLooks()` that expose the underlying OpenColorIO
  functionality. #3319 (2.4.0.2)
* Many long-deprecated functions in imageio.h and imagbufalgo.h are now
  marked as OIIO_DEPRECATED, and therefore may start to generate warnings
  if used by downstream software. #3328 (2.4.1.0)

Performance improvements:
* Raise the default ImageCache default tile cache from 256MB to 1GB. This
  should improve performance for some operations involving large images or
  images with many channels. #3180 (2.4.0/2.3.10)
* Performance of JPEG-2000 I/O is improved by 2-3x due to multithreading,
  but only if you are using a sufficiently new version of OpenJPEG (2.2
  for encoding, 2.4 for decoding). #2225 (2.3.11/2.4.0)
* Dramatically speed up (50-100x) the implementation of Strutil iequals,
  iless, starts_with, istarts_with, ends_with, iends_with. This in turn speeds
  up ParamValueList find/get related methods, ImageSpec find/get methods, and
  TS::get_texture_info. #3388 (2.4.1.1)
* Renderer users of the TextureSystem might see up to a ~40% speedup if
  using the new stochastic sampling features. #3127 #3457
* Speed up reading of uncompressed DDS images by about 3x. #3463 (2.4.2.0)

Fixes and feature enhancements:
* ImageSpec:
    - Implemented deserialization of extra_attribs from XML. #3066 (2.4.0/2.3.8)
    - Allow `getattribute("format")` to retrieve the name of the pixel data
      type. #3247 (2.4.0)
* ImageInput / ImageOutput:
    - Protected methods that make it easier to implement support for IOProxy
      in image readers and writers. #3231 (2.4.0)
    - Fix crash when ioproxy is passed to a plugin that doesn't support it.
      #3453 (2.4.2)
* ImageBuf / ImageBufAlgo:
    - Fix ImageBuf::read bug for images of mixed per-channel data types. #3088
      (2.4.0/2.3.8)
    - `IBA::noise()` now takes "blue" as a noise name. Also, "white" is now
      the preferred name for what used to be "uniform" (which still works as a
      synonym). #3141 (2.4.0/2.3.10)
    - Refactor ImageBuf::Iterator, ConstIterator templates, reduces compile
      time substantially. #3195 (2.4.0)
    - IBA functions taking a `cspan<>` now more flexibly can be passed
      an init list like `{ 0.2f, 0.4f, 0.5f }` instead of needing to wrap it
      in a `cspan<float>()` constructor. #3257 (2.3.12/2.4.0)
    - `make_texture()`: ensure that "maketx:ignore_unassoc" is honored.
      #3269 (2.4.0.1/2.3.12)
    - `IBA::computePixelStats()` improved precision. #3353 (2.4.1.0/2.3.14)
    - `IBA::isConstantColor()` is faster -- now if one thread finds its
      portion not constant, it can signal the other threads to stop
      immediately instead of completing their regions. #3383 (2.4.1.1)
    - A new flavor of `IBA::compare()` allows relative as well as absolute
      error thresholds. #3508 (2.3.19.0/2.4.2.2)
* ImageCache / TextureSystem / maketx:
    - When textures are created with the "monochrome_detect" feature enabled,
      which turns RGB textures where all channels are always equal into true
      single channel greyscale, the single channel that results is now
      correctly named "Y" instead of leaving it as "R" (it's not red, it's
      luminance). #3205 (2.4.0/2.3.10)
    - Enhance safety/correctness for untiled images that exceed 2GB size
      (there was an integer overflow problem in computing offsets within
      tiles). #3232 (2.3.11/2.4.0)
    - Improve error propagation from ImageCache to higher levels, especially
      for tile-reading errors encountered during ImageBuf iterator use, and
      ImageCache errors encountered when using the TextureSystem. #3233
      (2.4.0)
    - Support an additional UDIM pattern `<UVTILE>`, which is specified by
      MaterialX. #3280 #3285 (2.3.12/2.4.0.1)
    - Add support for UDIM pattern `<uvtile>` (used by Clarisse & V-Ray). #3358
      (2.4.1.0/2.3.14)
    - The `maketx --handed` option, or `oiiotool -attrib -otex:handed=...`, or
      adding "handed" metadata to the configuration ImageSpec being passed to
      `IBA::make_texture()` is now supported for communicating the handedness
      of a vector displacement or normal map. #3331 (2.4.0.2)
    - Speed up UDIM lookups by eliminating internal mutex. #3417 (2.4.0)
    - TextureSystem: Fix typo that prevented "max_tile_channels" attribute from
      being set or retrieved. (2.4.2/2.3.17)
* oiiotool:
    - `--ch` now has virtually no expense if the arguments require no change
      to the channel order or naming (previously, it would always incur an
      image allocation and copy even if no real work needed to be done). #3068
      (2.4.0/2.3.8)
    - `--ch` now warns if you specify a channel name that was not present
      in the input image. #3290 (2.4.0.1)
    - `--runstats` timing report has been improved and now more accurately
      attributes time to each operation. In particular, input I/O is now
      credited to "-i" rather than being incorrectly attributed to the other
      ops that happen to trigger I/O of previously mentioned files. #3073
      (2.4.0/2.3.8)
    - Allow quotes in command modifiers. #3112 (2.4.0/2.3.9)
    - Fix `--dumpdata` getting the formatting of floating point values wrong.
      #3131 (2.4.0/2.3.9)
    - `--dumpdata:C=name` causes the dumped image data to be formatted with
      the syntax of a C array. #3136 (2.4.0/2.3.9)
    - `--noise` now takes "blue" as an additional noise type. #3141
      (2.4.0/2.3.10)
    - `-d` now accepts "uint1", "uint2", "uint4", and "uint6" for formats that
      support such low bit depths (TIFF). #3141 (2.4.0/2.3.10)
    - `--invert` fixed to avoid losing the alpha channel values. #3191
      (2.4.0/2.3.10)
    - Fix bug when autocropping output images when the entire pixel data
      window is in the negative coordinate region. #3164 (2.4.0/2.3.10)
    - Improved detection of file reading failures. #3165 (2.4.0/2.3.10)
    - All commands that do filtering (--rotate, --warp, --reize, --fit, and
      --pixelaspect) now accept optional modifier `:highlightcomp=1` to enable
      "highlight compensation" to avoid ringing artifacts in HDR images with
      very high-contrast regions. #3239 (2.4.0)
    - `--pattern checker` behavior has changed slightly: if the optional
      modifier `:width=` is specified but `:height=` is not, the height will
      be equal to the width. #3255 (2.4.0)
    - `--pixelaspect` fixes setting of the "PixelAspectRatio", "XResolution",
      and "YResolution" metadata, they were not set properly before. #3340
      (2.4.0.3)
    - Fix bug that prevented metadata from being able to print as XML. #3499
      (2.4.2.2)
    - `i:ch=...` fixes crashes, and also improves the warning message in cases
      where the requested channels don't exist in the source image. #3513
      (2.4.2.2)
* Python bindings:
    - Subtle/asymptomatic bugs fixed in `ImageBufAlgo.color_range_check()` and
      `histogram()` due to incorrect release of the GIL. #3074 (2.4.0)
    - Bug fix for `ImageBufAlgo.clamp()`: when just a float was passed for the
      min or max, it only clamped the first channel instead of all channels.
      #3265 (2.3.12/2.4.0)
    - Fix the ability to `getattribute()` of int64 and uint64 metadata or
      attributes. #3555 (2.4.4.0)
* idiff:
    - `--allowfailures` allows that number of failed pixels of any magnitude.
      #3455 (2.4.2)
    - `--failrelative` and `--warnrelative` allows the failure and warning
      threshold to use a symmetric mean relative error (rather than the
      absolute error implied by the existing `--fail` and `--warn` arguments).
      #3508 (2.3.19.0, 2.4.2.2)
* BMP:
    - IOProxy support. #3223 (2.4.0)
    - Support for additional (not exactly fully documented) varieties used by
      some Adobe apps. #3375 (2.4.1.0/2.3.14)
    - Better detection of corrupted files with nonsensical image dimensions or
      total size. #3434 (2.4.2/2.3.17/2.2.21)
    - Protect against corrupted files that have palette indices out of bound.
      #3435 (2.4.2/2.3.17/2.2.21)
* DDS:
    - Don't set "texturetype" metadata, it should always have been only
      "textureformat". Also, add unit testing of DDS to the testsuite. #3200
      (2.4.0/2.3.10)
    - IOProxy support. #3217 (2.4.0)
    - Add support for BC4-BC7 compression methods. #3459 (2.4.2)
    - Speed up reading of uncompressed DDS images (by about 3x). #3463
    - Better handling of cube maps with MIPmap levels. #3467 (2.4.0)
    - For 2-channel DDS files, label them as Y,A if the flags indicate
      luminance and/or alpha, otherwise label them as R,G. #3530 (2.4.2.2)
    - Do not set "oiio:BitsPerSample" for cases where the dds.fmt.bpp field is
      not assumed to be valid. MS docs say it's valid only if the flags field
      indicates RGB, LUMINANCE, or YUV types. #3530 (2.4.2.2)
* FFMpeg
    - Now uses case-insensitive tests on file extensions, so does not get
      confused on Windows with all-caps filenames. #3364 (2.4.1.0/2.3.14)
    - Take care against possible double-free of allocated memory crash upon
      destruction. #3376 (2.4.1.0/2.3.14)
* GIF
    - IOProxy support. #3181 (2.4.0/2.3.10)
* HDR:
    - IOProxy support. #3218 (2.4.0)
* HEIF:
    - Handle images with unassociated alpha. #3146 (2.4.0/2.3.9)
* JPEG:
    - IOProxy support. #3182 (2.4.0/2.3.10)
    - Better handling of PixelAspectRatio. #3366 (2.4.1.0)
    - Fix multithreaded race condition in read_native_scanline. #3495
      (2.4.2.2)
    - Fix bug in XRes,YRes aspect ratio logic. #3500 (2.4.2.2)
    - When asked to output 2-channel images (which JPEG doesn't support), use
      the channel names to decide whether to drop the second channel (if it
      seems to be a luminance/alpha image) or add a third black channel (other
      cases). #3531 (2.4.2.2)
* JPEG2000:
    - Enable multithreading for decoding (if using OpenJPEG >= 2.2) and
      encoding (if using OpenJPEG >= 2.4). This speeds up JPEG-2000 I/O by
      3-4x. #2225 (2.3.11/2.4.0)
    - IOProxy support. #3226 (2.4.0)
    - Better detection and error reporting of failure to open the file.
      #3440 (2.4.2)
* OpenEXR:
    - When building against OpenEXR 3.1+ and when the global OIIO attribute
      "openexr:core" is set to nonzero, do more efficient multithreaded
      reading of OpenEXR files. #3107 (2.4.0/2.3.9.1)
    - Fix excessive memory usage when saving EXR files with many channels.
      #3176 (2.4.0/2.3.10)
    - When building against OpenEXR >= 3.1.3, our OpenEXR output now supports
      specifying the zip compression level (for example, by passing the
      "compression" metadata as "zip:4"). Also note than when using OpenEXR >=
      3.1.3, the default zip compression has been changed from 6 to 4, which
      writes compressed files significantly (tens of percent) faster, but only
      increases compressed file size by 1-2%. #3157 (2.4.0/2.3.10) Fixes in
      #3387 (2.4.1.1)
    - Fix writing deep exrs when buffer datatype doesn't match the file. #3369
      (2.4.1.0/2.3.14)
* PNG:
    - Assume sRGB color space as default when no color space attribute is
      in the file. #3321 (2.4.0.2/2.3.13)
    - Improve error detection and propagation for corrupt/broken files. #3442
      (2.4.2)
    - Improve error detection and messages when writing PNG files, for various
      kinds of errors involving metadata. #3535 (2.4.2.2)
* PPM:
    - Mark all PPM files as Rec709 color space, which they are by
      specification. #3321 (2.4.0.2/2.3.13)
* PSD:
    - IOProxy support. #3220 (2.4.0)
    - Better error messages for corrupted files and other failures. #3469
      (2.4.0)
* RAW:
    - When using libraw 0.21+, now support new color space names "DCE-P3",
      "Rec2020", and "sRGB-linear", and "ProPhoto-linear". Fix incorrect gamma
      values for "ProPhoto". #3123 #3153 (2.4.0/2.3.9.1)
* RLA:
    -  Better guards against malformed input. #3163 (2.4.0/2.3.10)
* Targa:
    - Improved error detection for read errors and corrupted files. #3120
      (2.4.0/2.3.9.1) #3162 (2.4.0/2.3.10)
    - Fixed bug when reading x-flipped images. #3162 (2.4.0/2.3.10)
    - IOProxy support. #3221 (2.4.0)
    - Better interpretation of TGA 1.0 files with alpha that is zero
      everywhere. Be more consistent with Targa attributes all being called
      "targa:foo". Add "targa:version" to reveal whether the file was TGA 1.0
      or 2.0 version of the format. #3279 (2.4.0.1/2.3.12)
    - Fix parsing of TGA 2.0 extension area when the software name was
      missing form the header. #3323 (2.4.0.2/2.3.13)
    - Fix reading of tiny 1x1 2-bpp Targa 1.0 images. #3433 (2.3.17/2.2.21)
* Socket imageio plugin has been removed entirely, it never was completed or
  did anything useful. #3527 (2.3.2.2)
* TIFF:
    - IOProxy is now supported for TIFF output. #3075 (2.4.0/2.3.8)
    - Honor zip compression quality request when writing TIFF. #3110
      (2.4.0/2.3.11)
    - Automatically switch to "bigtiff" format for really big (> 4GB) images.
      #3158 (2.4.0)
    - Support for palette images with 16 bit palette indices. #3262
      (2.4.0/2.3.12)
    - Gracefully handle missing ExtraSamples tag. #3287 (2.4.0.1/2.3.12)
    - New output configuration hint: "tiff:write_extrasamples" (default: 1),
      if set to 0, will cause the TIFF output to NOT include the required
      EXTRASAMPLES tag in the header. This is not recommended, but fixes
      a specific problem in some circumstances where PhotoShop misbehaves
      when the extrasamples tag is present. #3289 (2.4.0.1)
    - No longer write IPTC blocks to the TIFF header by default, it caused
      trouble and was sometimes corrupted. You can force it to write an IPTC
      block by using the output open configuration hint "tiff:write_iptc" set
      to nonzero. #3302 (2.4.0.1)
    - Fix read problems with TIFF files with non-zero y offset. #3419
      (2.3.17/2.4.2)
    - Fixed some longstanding issues with IPTC data in the headers. #3465
      (2.4.0)
    - Protect against crashes with certain empty string attributes. #3491
      (2.4.2.1)
* WebP:
    - Fix previous failure to properly set the "oiio:LoopCount" metadata
      when reading animated webp images. #3183 (2.4.0/2.3.10)
    - IOProxy support. #3224 (2.4.0)
* Better catching of exceptions thrown by OCIO 1.x if it encounters 2.0 config
  files. #3089 (2.4.0/2.3.9)
* Improved internal logic and error reporting of missing OCIO configs. #3092
  #3095
* Improved finding of fonts (by IBA::render_text and oiiotool --text). It now
  honors environment variable `$OPENIMAGEIO_FONTS` and global OIIO attribute
  "font_searchpath" to list directories to be searched when fonts are needed.
  #3096 (2.4.0/2.3.8)
* Fix crash that could happen with invalidly numbered UDIM files. #3116
  (2.4.0/2.3.9)
* Fix possible bad data alignment and SIMD assumptions inside TextureSystems
  internals. #3145 (2.4.0/2.3.9)
* Update internal stb_printf implementation (avoids some sanitizer alerts).
  #3160 (2.4.0/2.3.10)
* Replace the few remaining instances of `sscanf` in the codebase with Strutil
  utilities that are guaranteed to be locale-independent. #3178 (2.4.0)
* Security: New global OIIO attributes "limits:channels" (default: 1024) and
  "limits:imagesize_MB" (default: 32768, or 32 GB) are intended to reject
  input files that exceed these limits, on the assumption that they are either
  corrupt or maliciously constructed, and would, if read, lead to absurd
  allocations, crashes, or other mayhem. Apps may lower or raise these limits
  if they know that a legitimate input image exceeds these limits. Currently,
  only the TIFF reader checks these limits, but others will be modified to
  honor the limits over time. #3230 (2.3.11/2.4.0)
* Fix integer overflow warnings. #3329 (2.4.1.0)
* Improved behavior when opening a file whose format doesn't correctly match
  its extension: try common formats first, rather than alphabetically; and
  improve error messages. #3400 (2.4.2)
* The maximum number of threads you can set with option "oiio:threads"
  has been increased from 256 to 512. #3484 (2.4.2.1)
* Make access to the internal imageio_mutex not be recursive. #3489 (2.4.2.2)
* Various protections against string metadata found in file that has zero
  length. #3493 (2.4.2.2)
* Fix possible null pointer dereference in inventory_udim. #3498 (2.4.2.2)
* oiiotool, maketx, iinfo, igrep, and iv now all take a `--version` command
  line argument, which just prints the OIIO version and exits. #3534

Developer goodies / internals:
* benchmark.h:
    - Alter the declaration of DoNotOptimize() so that it doesn't have
      compilation problems on some platforms. #3444 (2.4.2/2.3.17)
* filesystem.h:
    - A new version of `searchpath_split` returns the vector of strings rather
      than needing to be passed a reference. #3154 (2.4.0/2.3.10)
    - New `write_binary_file()` utility function. #3199 (2.4.0/2.3.10)
    - `searchpath_split()` fixes to better handle empty paths. #3306 (2.4.0.1)
* fmath.h:
    - Added `round_down_to_multiple()`. Also, more correctly handle
      `round_to_multiple()` results when the value is < 0. #3104
    - Add `round_down_to_multiple()` and improve `round_to_multiple()` to
      correctly handle cases where the value is less than 0. #3104
      (2.4.0/2.3.8)
    - Make bit_cast specialization take refs, like the template. This fixes
      warnings for some compilers. #3213 (2.4.0/2.3.10.1)
* imageio.h:
    - ImageInput and ImageOutput have many new helper methods (protected,
      meant for II and IO subclass implementations to use, not users of these
      classes) for helping to implement IOProxy support in format readers and
      writers. #3203 #3222 (2.4.0)
* Imath.h:
    - In addition to including the right Imath headers for the version that
      OIIO is built with, this defines custom formatters for the Imath types
      for use with fmt::format/print or Strutil::format/print. #3367 (2.4.1.0)
* oiioversion.h
    - `OIIO_MAKE_VERSION_STRING` and `OIIO_VERSION_STRING` now print all 4
      version parts. #3368 (2.4.1.0)
* parallel.h
    - Refactoring of the entry points (back compatible for API), and add
      support for using TBB for the thread pool (which seems slightly faster
      than our internal thread pool). By default it still uses the internal
      pool, but if OIIO::attribute("use_tbb") is set to nonzero, it will use
      the TBB thread pool if built against TBB. #3473 (2.4.2.2) #3566
      (2.4.4.0)
* paramlist.h
    - Various internal fixes that reduce the amount of ustring construction
      that happens when constructing ParamValue and ParamList, and making
      certain ImageSpec::attribute() calls. #3342 (2.4.1.0)
* simd.h:
    - Better guards to make it safe to include from Cuda. #3291 #3292
      (2.4.0.1/2.3.12)
    - Fix compiler warnings related to discrepancies between template
      declaration and redeclaration in simd.h. #3350 (2.4.1.0/2.3.14)
    - The vector types all now have a `size()` method giving its length.
      #3367 (2.4.1.0)
    - Defines custom formatters for the vector and matrix types, for use
      with fmt::format/print or Strutil::format/print. #3367 (2.4.1.0)
* string_view.h
    - Auto-conversion between our string_view, std::string_view (when
      available), and fmt::string_view. #3337 (2.4.1.0)
    - OIIO::string_view is now fully templated, to match std::string_view.
      #3344 (2.4.1.0)
* strutil.h:
    - New utility functions: parse_values(), scan_values(), scan_datetime()
      #3173 #3177 (2.4.0/2.3.10), edit_distance() #3229 (2.4.0/2.3.11)
    - The `utf8_to_utf16()` and `ut16_to_utf8()` utilities are now exposed on
      all platforms, not just windows (and their internals have been
      modernized). #3307 (2.4.0.1)
    - `Strutil::isspace()` is a safe alternative to C isspace(), that works
      even for signed characters. #3310 (2.4.1.0)
    - `Strutil::print()` now is buffered (and much more efficient, and
      directly wraps fmt::print). A new `Strutil::sync::print()` is a version
      that does a flush after every call. #3348 (2.4.1.0)
    - `get_rest_arguments()` fixes conflict between RESTful and Windows long
      path notations. #3372 (2.4.1.0/2.3.14)
    - Dramatically speed up (50-100x) Strutil iequals, iless, starts_with,
      istarts_with, ends_with, iends_with. #3388 (2.4.1.1)
    - New `safe_strcat` is a buffer-length-aware safe replcement for strcat.
      #3471 (2.4.0/2.3.18)
    - `Strutil::debug()` is the new OIIO::debug(), moving it from
      libOpenImageIO to libOpenImageIO_Util. #3486 (2.4.2.1)
    - New `Strutil::safe_strlen()` is a portable safe strlen replacement.
      #3501 (2.4.2.2)
* sysutil.h:
    - The `Term` class now recognizes a wider set of terminal emulators as
      supporting color output. #3185 (2.4.0)
* timer.h:
    - `Timer::add_seconds()` and `Timer::add_ticks()` allows add/subtract
      directly to a timer's elapsed value. #3070 (2.4.0/2.3.8)
    - For Linux, switch from using gettimeofday to clock_gettime, for
      potentially higher resolution. #3443 (2.4.2)
* typedesc.h:
    - Add Cuda host/device decorations to TypeDesc methods to make them GPU
      friendly. #3188 (2.4.0/2.3.10)
    - TypeDesc constructor from a string now accepts "box2f" and "box3f"
      as synonyms for "box2" and "box3", respectively. #3183 (2.4.0/2.3.10)
* type_traits.h:
    - This new header contains a variety of type traits used by other OIIO
      headers. They aren't really part of the public API, but they are sometimes
      used by public headers. #3367 (2.4.1.0)
* unittest.h:
    - Changes `OIIO_CHECK_SIMD_EQUAL_THRESH` macro to compare `<= eps`
      instead of `<`. #3333 (2.4.0.3)
* unordered_map_concurrent.h: Fix bug in `erase()` method. #3485 (2.4.2.2)
* ustring.h:
    - New static method `from_hash()` creates a ustring from the known hash
      value. #3397 (2.4.2)
    - New `ustringhash` class is just like a ustring, except that the "local"
      representation is the hash, rather than the unique string pointer. #3436
      (2.4.2)
* vecparam.h:
    - New `V3fParam`, `M33fParam`, and `M44fParam` (defined in vecparam.h) are
      used just for parameter passing in public APIs, instead of Imath::V3f,
      M33f, or M44f, in order to more fully hide Imath types from our public
      interfaces. These are only parameter-passing classes, and are not useful
      as vector or matrix classes in their own right. But they seamlessly cast
      to and from other vector- and matrix-like classes. #3330 (2.4.1.0)
* More internals conversion to use the new fmt style for string formatting,
  console output, error messages, and warnings: oiiotool internals #3240
  (2.4.0); TS/IC stats output #3374 (2.4.1.0); misc #3777 (2.4.1.0); testshade
  #3415 (2.4.2)
* Internals are working toward removing all uses of string_view::c_str(),
  since that isn't part of C++17 std::string_view. #3315 (2.4.0.1)
* New testtex options: `--minthreads` sets the minimum numer of threads that
  will be used for thread wedges, `--lowtrials` is an optional maximum number
  of trials just for the 1 or 2 thread cse. #3418 (2.4.2)
* Internals: internal classes with vertual methods now mark all their
  overridden destructors correctly as `override`. #3481 (2.4.2.1) #3488 #3511
  (2.4.2.2)

Build/test system improvements and platform ports:
* CMake build system and scripts:
    - Remove the old FindOpenImageIO.cmake module; downstream clients should
      instead use our exported configs. #3098 (2.4.0/2.3.8)
    - Fix over-use of targets when we should have been using variables. #3108
      (2.4.0/2.3.9)
    - CMake variable `-DENABLE_INSTALL_testtex=1` causes `testtex` to be
      installed as an application. #3111 (2.4.0)
    - Make `OpenImageIO_SUPPORTED_RELEASE` into a CMake cache variable so it
      can be overridden at build time. #3142 (2.4.0)
    - New build option `-DTIME_COMMANDS=ON` will print time to compile each
      module (for investigating build performance; only useful when building
      with `CMAKE_BUILD_PARALLEL_LEVEL=1`). #3194 (2.4.0/2.3.10)
    - `PROJECT_VERSION_RELEASE_TYPE` is now a cache variable that can be
      overridden at build time. #3197 (2.4.0/2.3.10)
    - Set and use the variable `PROJECT_IS_TOP_LEVEL` to know if OIIO is a
      top level project or a subproject. #3197 (2.4.0/2.3.10)
    - Restore code that finds Jasper when using statically-linked libraw.
      #3210 (2.4.0/2.3.10.1)
    - Gracefully handle failing to find git for test data download. #3212
      (2.4.0/2.3.10.1)
    - Make sure to properly use the tbb target if it exists. #3214
      (2.4.0/2.3.10.1)
    - Use a project-specific "OpenImageIO_CI" for whether we're running in CI,
      rather than the confusingly generic "CI" #3211 (2.4.0/2.3.11)
    - If CMake variable `BUILD_TESTING` is OFF, don't do any automatic
      downloading of missing test data. #3227 (2.3.11/2.4.0)
    - Fixes to FindOpenColorIO.cmake module, now it prefers an OCIO exported
      cmake config (for OCIO 2.1+) unless OPENCOLORIO_NO_CONFIG=ON is set.
      #3278 (2.4.0.1/2.3.12)
    - Fix problems with FindOpenEXR build script for Windows. #3281
      (2.4.0.1/2.3.12)
    - New CMake cache variable `DOWNSTREAM_CXX_STANDARD` specifies which C++
      standard is the minimum for downstream projects (currently 14), which
      may be less than the `CMAKE_CXX_STANDARD` that specifies which C++
      standard we are using to build OIIO itself. #3288 (2.4.0.1)
    - The exported cmake configs now use relative paths so they are
      relocatable. #3302 (2.4.0.1)
    - CMake variable `OPENIMAGEIO_CONFIG_DO_NOT_FIND_IMATH`, if set to ON,
      will make our generated config file not do a find_dependency(Imath).
      (Use with caution.) #3335 (2.4.0.3)
    - Can now do unity/jumbo builds. This isn't helpful when building with
      many cores/threads, but in thread-limited situtations (such as CI), it
      can speed up builds a lot to use `-DCMAKE_UNITY_BUILD=ON`. #3381 #3389
      #3392 #3393 #3398 #3402 (2.4.2.0)
    - Do not auto-download test images by default. To auto download test
      images, build with `-DOIIO_DOWNLOAD_MISSING_TESTDATA=ON`. #3409 (2.4.0)
    - Allow using the Makefile wrapper on arm64 systems. #3456 (2.4.2)
    - The export OpenImageIOConfig.cmake fixes `OpenImageIO_INCLUDE_DIR` to
      work correctly on Debian systems where there are multiple filesystem
      components to the path. #3487 (2.4.2.1)
    - On MacOS, do not force MACOS_RPATH on. #3523 (2.4.2.2)
    - Improvements to the generated cmake config files when building static
      libraries. #3552 #3557 (by Povilas Kanapickas) (2.4.4.0)
* Dependency version support:
    - When using C++17, use std::gcd instead of boost. #3076 (2.4.0)
    - When using C++17, use `inline constexpr` instead of certain statics.
      #3119 (2.4.0)
    - Fixes to work with the libraw 202110 snapshot. #3143 (2.4.0/2.3.9.1)
    - Fix occasional build breaks related to OpenCV headers. #3135
      (2.4.0/2.3.9)
    - The internals of `Filesystem::searchpath_split` have been reimplemented
      in such a way as to no longer need boost.tokenzer. #3154 (2.4.0/2.3.10)
    - Deal with the fact that OpenColorIO has changed its default branch
      name to "main". #3169 (2.4.0/2.3.10/2.2.20)
    - pybind11 v2.9.0 incorporated into our testing and CI. #3248
    - Fix clang10 compile warnings. #3272 (2.4.0.1/2.3.12)
    - Support for ffmpeg 5.0. #3282 (2.4.0.2/2.3.13)
    - Support for fmtlib 9.0.0. #3327 (2.4.0.2/2.3.13) #3466 (2.4.2/2.3.18)
    - `build_opencolorio.bash` helper script bumped its default build of
      OpenColorIO to 2.1.2. #3475 (2.4.2.1)
    - When building with C++17 or higher, Boost.filesystem is no longer
      needed or used. #3472 #3477 (2.4.2.1)
    - Upgrade the internal fallback implemention of PugiXML to the latest
      version. #3494 (2.4.2.2)
    - Fixes for ffmpeg 5.1 detection. #3516 (2.3.19.0/2.4.2.2)
    - Support for gcc 12.1. #3480 (2.4.2.1) #3551 (2.4.4.0)
    - Support building with clang 15.0. #3563 (2.4.4.0)
    - Try FORTIFY_SOURCE [#3575](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3575)
* Testing and Continuous integration (CI) systems:
    - Properly test against all the versions of VFX Platform 2022. #3074
      (2.4.0)
    - The helper script `build_libtiff.bash` now allows you to override the
      build type (by setting `LIBTIFF_BUILD_TYPE`) and also bumps the default
      libtiff that it downloads and builds from 4.1.0 to 4.3.0. #3161 (2.4.0)
    - New tests on MacOS 11 #3193 (2.4.0/2.3.10) and MacOS 12, remove test on
      MacOS 10.15 (GitHub Actions is imminently removing MacOS 10.15). #3528
      (2.3.19.0/2.4.2.2)
    - Add a DDS test (we never had one before). #3200 (2.4.0/2.3.10)
    - `imageinout_test` now has options to make it easy to unit test just one
      named format, as well as to preserve the temp files for inspection.
      #3201 (2.4.0/2.3.10)
    - Add an HDR test (we never had one before). #3218 (2.4.0)
    - Fix bugs in the build_opencolorio.bash script, did not correctly handle
      installation into custom directories. #3278 (2.4.0.1/2.3.12)
    - Failed build artifact storage is revised to save more cmake-related
      artifacts to help debugging. #3311 (2.4.0.1)
    - Now doing CI builds for Intel icc and icx compilers. #3355 #3363
      (2.4.1.0/2.3.13) #3407 (2.4.0)
    - Overhaul of ci.yml file to be more clear and compact by using GHA
      "strategy" feature. #3356 #3365 (2.4.1.0/2.3.13)
    - Removed CI for windows-2016 GHA instance which will soon be removed.
      #3370 (2.4.1.0)
    - Test against clang 14. #3404
    - Various guards against supply chain attacks durig CI. #3454 (2.4.2)
    - Test against pybind11 v2.10. #3478 (2.4.2.1)
    - Run SonarCloud nightly for static analysis and coverage analysis. #3505
      (2.4.2.2)
* Platform support:
    - Fix when building with Clang on big-endian architectures. #3133
      (2.4.0/2.3.9)
    - Improvements to NetBSD and OpenBSD support. #3137. (2.4.0/2.3.9)
    - Fixes for MSVS compile. #3168 (2.4.0/2.3.10)
    - Fix problems on Windows with MSVC for Debug builds, where crashes were
      occurring inside `isspace()` calls. #3310
    - Improved simd.h support for armv7 and aarch32. #3361 (2.4.1.0/2.3.14)
    - Suppress MacOS wasnings about OpenGL deprecation. #3380 (2.4.1.0/2.3.14)
    - Fix MSVS/Windows errors. #3382 (2.4.1.1)
    - Fix cross-compiling on Android failing due to `-latomic` check.
      [#3560](https://github.com/AcademySoftwareFoundation/OpenImageIO/pull/3560) (by Povilas Kanapickas) (2.4.4.0)
    - Fix building on iOS. #3562 (2.4.4.0)

Notable documentation changes:
* Add an oiiotool example of putting a border around an image. #3138
  (2.4.0/2.3.9)
* Fix explanation of ImageCache "failure_retries" attribute. #3147
  (2.4.0/2.3.9)
* Improved maketx argument explanations.
* Clean up intra-document section references. #3238 (2.3.11/2.4.0)
* New explanations about input and output configuration hints. #3238
  (2.3.11/2.4.0)
* More code examples in both C++ and Python (especially for the ImageInput,
  ImageOutput, and ImageBufAlgo chapters). #3238 #3244 #3250 (2.3.11/2.4.0)
  #3263 (2.3.12/2.4.0)
* Pretty much anyplace where a parameter that represents a filename, and it is
  supporting UTF-8 encoding of Unicode filenames, the docs for that function
  explicitly say that the string is assumed to be UTF-8. #3312 (2.4.0.1)
* Fix many typos in docs. #3492 (2.4.2.2)



Release 2.3.20 (1 Oct 2022) -- compared to 2.3.19
-------------------------------------------------
* Fixes to compile with gcc 12. #3551
* Fixes to compile with clang 15. #3563
* PNG: better error handling when errors are encountered while writing. #3535

Release 2.3.19 (1 Sep 2022) -- compared to 2.3.18
---------------------------------------------------
* idiff: `--allowfailures` allows the specified number of pixels to differ by
  any amount, and still consider the images to compare successfully. #3455
* idiff: `--failrelative` and `--warnrelative` allows the failure and warning
  threshold to use a symmetric mean relative error (rather than the absolute
  error implied by the existing `--fail` and `--warn` arguments). #3508
* Build: Fixes for ffmpeg 5.1 detection. #3516
* Build: suppress incorrect warnings for gcc 12. #3524
* CI: New test on MacOS 12, remove test on MacOS 10.15 (GitHub Actions is
  imminently removing MacOS 10.15). #3528
* oiiotool, maketx, iinfo, igrep, and iv now all take a `--version` command
  line argument, which just prints the OIIO version and exits. #3534
* `OIIO::getattribute("version")` now retrieves the version string. #3534
* Developer goodies: `ArgParse::add_version(str)` tells ArgParse the version
  string, which will automatically add an option `--version`. #3534

Release 2.3.18 (1 Aug 2022) -- compared to 2.3.17
---------------------------------------------------
* Windows: Allow loading of dlls from PATH on Python 3.8+. #3470
* JPEG: Fix a race condition in read_native_scanline. #3495
* JPEG: Fix aspect ratio logic. #3500
* Bug fix: incorrect assignment of oiio_missingcolor attribute. #3497
* Bug fix: possible null pointer dereference in inventory_udim(). #3498
* Bug fix: print_info_subimage botched condition. #3499
* CI: Test against fmt 9.0.0. #3466
* CI: Test against pybind11 v2.10. #3478
* Strutil: safe_strcat() #3471 and safe_strlen() #3501
* Change build_opencolorio.bash to default to OCIO 2.1.2. #3475

Release 2.3.17 (1 Jul 2022) -- compared to 2.3.16
--------------------------------------------------
* TIFF: fix read problems with TIFF files with non-zero y offset. #3419
* Targa: Fix reading of tiny 1x1 2-bpp Targa 1.0 images. #3433 (2.3.17/2.2.21)
* BMP: better detection of corrupted files with nonsensical image dimensions
  or total size. #3434 (2.3.17/2.2.21)
* BMP: protect against corrupted files that have palette indices out of bound.
  #3435 (2.3.17/2.2.21)
* TextureSystem: Fix typo that prevented "max_tile_channels" attribute from
  being set or retrieved. (2.3.17)
* ustring.h: ustring has added a from_hash() static method #3397, and a
  ustringhash helper class #3436. (2.3.17/2.2.21)
* benchmark.h: Alter the declaration of DoNotOptimize() so that it doesn't
  have compilation problems on some platforms. #3444 (2.3.17)
* Fix crash when ioproxy is passed to an image writer that doesn't support it.
  #3453 (2.3.17)
* Fix the "Makefile" wrapper to correctly recognize arm64 ("Apple silicon").
  #3456 (2.3.17)

Release 2.3.16 (1 Jun 2022) -- compared to 2.3.15
--------------------------------------------------
* Support for Intel llvm-based compiler 2022.1.0. #3407
* Internals: custom fmt formatters for vector types. #3367
* Fix compiler breaks when using some changes in fmtlib master (not yet
  released). #3416
* UDIM textures have been sped up by 5-8%. #3417

Release 2.3.15 (1 May 2022) -- compared to 2.3.14
--------------------------------------------------
* JPEG: Better handling of PixelAspectRatio. #3366
* OpenEXR: Fix DWAA compression default level. #3387
* Perf: Huge speed-up of case-insensitive string comparisons (Strutil iequals,
  iless, starts_with, istarts_with, ends_with, iends_with), which also speeds
  up searches for attributes by name in ImageSpec and ParamValueList. #3388
* New `ImageBufAlgo::st_warp()` (and `oiiotool --st_warp`) perform warping of
  an image where a second image gives the (s,t) coordinates to look up from at
  every pixel. #3379
* Python: Add ImageSpec and ParamValueList method `get_bytes_attribute()`,
  which is like `get_string_attribute()`, but returns the string as a Python
  bytes object. In Python 3, strings are UTF-8, so this can be useful if you
  know that a string attribute might contain non-UTF8 data. #3396

Release 2.3.14 (1 Apr 2022) -- compared to 2.3.13
--------------------------------------------------
* Add support for UDIM pattern `<uvtile>` (used by Clarisse & V-Ray). #3358
* BMP: Support for additional (not exactly fully documented) varieties used by
  some Adobe apps. #3375
* Python: support uint8 array attributes in and out. This enables the proper
  Python access to "ICCProfile" metadata. #3378
* Improved precision in IBA::computePixelStats(). #3353
* ffmpeg reader not uses case-insensitive tests on file extensions. #3364
* Fix writing deep exrs when buffer datatype doesn't match the file. #3369
* Fix conflict between RESTful and Windows long path notations. #3372
* ffmpeg reader: take care against possible double-free of allocated memory
  crash upon destruction. #3376
* simd.h fixes for armv7 and aarch32. #3361
* Fix compiler warnings related to discrepancies between template declaration
  and redeclaration in simd.h and benchmark.h. #3350
* Suppress MacOS warnings about OpenGL depreation. #3380
* Now doing CI builds for Intel icc and icx compilers. #3355 #3363
* CI: Overhaul of yml file to be more clear and compact by using GHA
  "strategy" feature. #3356 #3365

Release 2.3.13 (1 Mar 2022) -- compared to 2.3.12
--------------------------------------------------
* Filesystm::searchpath_split better handling of empty paths. #3306
* New Strutil::isspace() is an isspace replacement that is safe for char
  values that are < 0. #3310
* Expose the Strutil::utf8_to_utf16() and utf16_to_utf8() utilities on
  non-Windows platforms (and also modernize their internals). #3307
* For the most important ImageInput, ImageOutput, and ImageBuf methods that
  take a filename, add new flavors that can accept a `wstring` as the
  filename. #3312 #3318
* PPM: properly report color space as Rec709 (as dictated by PPM spec). #3321
* PNG: more robust reporting of color space as sRGB in the absence of header
  fields contradicting this. #3321
* strutil.h: Split the including of fmt.h and some related logic into a
  separate detail/fmt.h. This is still included by strutil.h, so users
  should not notice any change. #3327
* Targa: Fix parsing of TGA 2.0 extension area. #3323
* Support building against FFmpeg 5.0. #3282
* oiiotool --pixelaspect : fix setting of "PixelAspectRatio", "XResolution",
  and "YResolution" attributes in the output file (were not set properly
  before). #3340

Release 2.3.12 (1 Feb 2022) -- compared to 2.3.11
--------------------------------------------------
* oiiotool: Don't give spurious warnings about no output when the --colorcount
  or --rangecheck commands are used. #3262
* `oiiotool --pattern checker` fixed behavior so that if only the checker
  width was specified but not the height, height will be equal to width. #3255
* `oiiotool --point` lets you set individual pixels. #3256
* Python: A new ImageBuf constructor was added that takes only a NumPy
  ndarray, and deduces the resolution, channels, and format (pixel data type)
  from the shape of the array. #3246
* Python: Implement `ROI.copy()`. #3253
* Python: ImageSpec and ParamValueList now support `'key' in spec`,
  `del spec['key']`, and `spec.get('key', defaultval)` to more fully emulate
  Python `dict` syntax for manipulating metadata. #3252 (2.3.12/2.4.0)
* Python bug fix: fix `clamp()` when the min or max are just a float. Now
  it uses that one value for all channels, instead of using it only for
  the first channel. #3265
* ImageSpec gained an additional constructor that takes a string
  representation of the pixel data type (where it used to insist on a
  TypeDesc), such as `ImageSpec(640, 480, 3, "uint8")`. This is especially
  helpful for new/casual users, or when you want code to be maximally
  readable. #3245
* `Imagepec::getattribute()` new query token `"format"` can retrieve the pixel
  data type. #3247
* `IBA::make_texture()`: ensure that "maketx:ignore_unassoc" is honored. #3269
* Support an additional UDIM pattern `<UVTILE>`, which is specified by
  MaterialX. #3280
* TIFF: support 16-bit palette images. #3260
* TIFF: Gracefully handle missing ExtraSamples tag. #3287
* Targa: Better interpretation of TGA 1.0 files with alpha that is zero
  everywhere. Be more consistent with Targa attributes all being called
  "targa:foo". Add "targa:version" to reveal whether the file was TGA 1.0
  or 2.0 version of the format. #3279
* simd.h: Better guards to make it safe to include from Cuda. #3291 #3292
* Fix bugs in the build_opencolorio.bash script, did not correctly handle
  installation into custom directories. #3278
* Fixes to FindOpenColorIO.cmake module, now it prefers an OCIO exported cmake
  config (for OCIO 2.1+) unless OPENCOLORIO_NO_CONFIG=ON is set. #3278
* Docs: The ImageBufAlgo chapter now has examples for C++, Python, and
  oiiotool for almost every operation. #3263

Release 2.3.11 (1 Jan 2022) -- compared to 2.3.10
--------------------------------------------------
* JPEG2000: enable multithreading for decoding (if using OpenJPEG >= 2.2)
  and encoding (if using OpenJPEG >= 2.4). This speeds up JPEG-2000 I/O
  by 3-4x. #2225
* TIFF: automatically switch to "bigtiff" format for >4GB images. #3158
* Security: New global OIIO attributes "limits:channels" (default: 1024) and
  "limits:imagesize_MB" (default: 32768, or 32 GB) are intended to reject
  input files that exceed these limits, on the assumption that they are either
  corrupt or maliciously constructed, and would, if read, lead to absurd
  allocations, crashes, or other mayhem. Apps may lower or raise these limits
  if they know that a legitimate input image exceeds these limits. Currently,
  only the TIFF reader checks these limits, but others will be modified to
  honor the limits over time. #3230
* TextureSystem: enhance safety/correctness for untiled images that exceed
  2GB size (there was an integer overflow problem in computing offsets within
  tiles). #3232
* Cleanup: Get rid of an obsolete header c-imageio.h that was experimental
  and the functions declared therein were not implemented in this release.
  #3237
* Build: rely on env variable "OpenImageIO_CI" to tell us if we are running in
  a CI environment, not the more generic "CI" which could be set for other
  reasons in some environments. #3211
* Build: Improvements in how we find OpenVDB. #3216
* Build: If CMake variable `BUILD_TESTING` is OFF, don't do any automatic
  downloading of missing test data. #3227
* Dev: Add Strutil::edit_distance(). #3229
* Docs: Clean up intra-document section references, new explanations about
  input and output configuration hints, more code examples in both C++ and
  Python (especially for the ImageInput and ImageOutput chapters). #3238 #3244

Release 2.3.10.1 (7 Dec 2021) -- compared to 2.3.10.0
-----------------------------------------------------
* Build: restore code that finds Jasper when using statically-linked libraw.
  #3210
* Build/test: Gracefully handle failing to find git for test data download.
  #3212
* fmath.h: bit_cast specialization should take refs, like the template.
  This made warnings for some compilers. #3213
* Build: make sure to properly use the tbb target if it exists. #3214

Release 2.3.10 (1 Dec 2021) -- compared to 2.3.9
--------------------------------------------------
New (non-compatibility-breaking) features:
* TextureSystem: add feature for stochastic mipmap interpolation. This adds
  new interpolation modes "StochasticTrilinear" and "StochasticAniso", which
  in conjunction with the "rnd" field in TextureOpt, will stochastically
  choose between bracketing MIPmap levels rather than interpolating them. This
  reduces texture lookup cost by up to 40%, but it's only useful in the
  context of a renderer that uses many samples per pixel. #3127
* maketx/make_texture() now supports options to store Gaussian forward and
  inverse transform lookup tables in image metadata (must be OpenEXR textures
  for this to work) to aid writing shaders that use histogram-preserving
  blending of texture tiling. This is controlled by new maketx arguments
  `--cdf`, `--cdfsigma`, `--sdfbits`, or for `IBA::make_texture()` by using
  hints `maketx:cdf`, `maketx:cdfsigma`, and `maketx:cdfbits`. #3159 #3206
* `oiitool --oiioattrib` can set "global" OIIO control attributes for
  an oiiotool run (equivalent of calling `OIIO::attribute()`). #3171
* `oiiotool --repremult` exposes the previously existing `IBA::repremult()`.
  The guidance here is that `--premult` should be used for one-time conversion
  of "unassociated alpha/unpremultiplied color" to associated/premultiplied,
  but when you are starting with a premultiplied image and have a sequence of
  unpremultiply, doing some adjustment in unpremultiplied space, then
  re-premultiplying, it's `--repremult` you want as the last step, because it
  preserves alpha = 0, color > 0 data without crushing it to black. #3192
* `oiiotool --saturate` and `IBA::saturate()` can adjust saturation level of a
  color image. #3190
* `oiiotool --maxchan` and `--minchan`, and `IBA::maxchan()` and `minchan()`
  turn an N-channel image into a 1-channel images that for each pixel,
  contains the maximum value in any channel of the original for that pixel.
  #3198
* When building against OpenEXR >= 3.1.3, our OpenEXR output now supports
  specifying the zip compression level (for example, by passing the
  "compression" metadata as "zip:4"). Also note than when using OpenEXR >=
  3.1.3, the default zip compression has been changed from 6 to 4, which
  writes compressed files significantly (tens of percent) faster, but only
  increases compressed file size by 1-2%. #3157
* Improved image dithering facilities: When dithering is chosen, it now
  happens any time you reduce >8 bits to <= 8 bits (not just when converting
  from float or half); change the dither pattern from hashed to blue noise,
  which looks MUCH better (beware slightly changed appearance); `IBA::noise()`
  and `oiiotool --noise` now take "blue" as a noise name, giving a blue noise
  pattern; `IBA::bluenoise_image()` returns a reference to a stored periodic
  blue noise image; `oiiotool -d` now lets you ask for "uint6", "uint4",
  "uint2", and "uint1" bit depths, for formats that support them. #3141
* New global OIIO attribute `"try_all_readers"` can be set to 0 if you want to
  override the default behavior and specifically NOT try any format readers
  that don't match the file extension of an input image (usually, it will try
  that one first, but it if fails to open the file, all known file readers
  will be tried in case the file is just misnamed, but sometimes you don't
  want it to do that). #3172
* Raise the default ImageCache default tile cache from 256MB to 1GB. This
  should improve performance for some operations involving large images or
  images with many channels. #3180
* IOProxy support has been added to JPEG output (already was supported for
  JPEG input) and for GIF input and output. #3181 #3182

Bug fixes:
* Fix `oiiotool --invert` to avoid losing the alpha channel values. #3191
* Fix excessive memory usage when saving EXR files with many channels. #3176
* WebP: Fix previous failure to properly set the "oiio:LoopCount" metadata
  for animated webp images. #3183
* Targa: Better detection/safety when reading corrupted files, and fixed
  bug when reading x-flipped images. #3162
* RLA: better guards against malformed input. #3163
* Fix oiiotool bug when autocropping output images when the entire pixel data
  window is in the negative coordinate region. #3164
* oiiotool improved detection of file reading failures. #3165
* DDS: Don't set "texturetype" metadata, it should always have been only
  "textureformat". Also, add unit testing of DDS to the testsuite. #3200
* When textures are created with the "monochrome-detect" feature enabled,
  which turns RGB textures where all channels are always equal into true
  single channel greyscale, the single channel that results is now correctly
  named "Y" instead of leaving it as "R" (it's not red, it's luminance).
  #3205

Build fixes and developer goodies:
* Update internal stb_printf implementation (avoids some sanitizer alerts).
  #3160
* Fixes for MSVS compile. #3168
* Add Cuda host/device decorations to TypeDesc methods to make them GPU
  friendly. #3188
* TypeDesc: The constructor from a string now accepts "box2f" and "box3f"
  as synonyms for "box2" and "box3", respectively. #3183
* New Strutil::parse_values, scan_values, scan_datetime, parse_line. #3173
  #3177
* New `Filesystem::write_binary_file()` utility function. #3199
* New build option `-DTIME_COMMANDS=ON` will print time to compile each module
  (for investigating build performance; only useful when building with
  `CMAKE_BUILD_PARALLEL_LEVEL=1`). #3194

Release 2.3.9.1 (1 Nov 2021) -- compared to 2.3.8
--------------------------------------------------
* OpenEXR: When building against OpenEXR 3.1+ and when the global OIIO
  attribute "openexr:core" is set to nonzero, do more efficient multithreaded
  reading of OpenEXR files. #3107
* `oiiotool --dumpdata:C=name` causes the dumped image data to be formatted
  with the syntax of a C array. #3136
* oiiotool: Allow quotes in command modifiers. #3112
* jpeg input: remove stray debugging output to console. #3134
* HEIF: Handle images with unassociated alpha. #3146
* Targa: improved error detection for read errors and corrupted files. #3120
* raw: When using libraw 0.21+, now support new color space names "DCE-P3",
  "Rec2020", and "sRGB-linear", and "ProPhoto-linear". Fix incorrect gamma
  values for "ProPhoto". #3123 #3153 Fixes to work with the libraw 202110
  snapshot. #3143
* TIFF: honor zip compression quality request when writing TIFF. #3110
* Fix broken oiiotool --dumpdata output. #3131
* Fix possible bad data alignment and SIMD assumptions inside TextureSystems
  internals. #3145
* Field3D, which is no longer actively supported, now has support disabled in
  the default build. To enable Field3D support, you must build with
  `-DENABLE_FIELD3D=1`. Note that we expect it to be no longer supported at
  all, beginning with OIIO 2.4. #3140
* Build: Address new warnings revealed by clang 13. #3122
* Build: Fix when building with Clang on big-endian architectures. #3133
* Build: Fix occasional build breaks related to OpenCV headers. #3135
* Build: Improvements to NetBSD and OpenBSD support. #3137.
* docs: Add an oiiotool example of putting a border around an image. #3138
* docs: Fix explanation of ImageCache "falure_retries" attribute. #3147

Release 2.3.8 (1 Oct 2021) -- compared to 2.3.7
--------------------------------------------------
* Fix ImageBuf::read() bug for images of mixed per-channel data types. #3088
* Fix crash that could happen with invalidly numbered UDIM files. #3116
* Better catching of exceptions and other error handling when OpenColorIO 1.x
  is used but encounters an OpenColorIO 2.x config file. #3089 #3092 #3095
* Ensure that OpenColorIO doesn't send info messages to the console if no
  config is found. #3113
* Fix: make sure ImageSpec deserialization works for arbitrary attribs. #3066
* `oiiotool -ch` now has greatly reduced cost (no useless allocations or
  copies) when the channel order and names don't change. #3068
* `oiiotool --runstats` is now much better about correctly attributing I/O
  time to `-i` instead of to the subsequent operations that triggers the
  read. #3073
* TIFF output now supports IO proxies. #3075 #3077
* Improved finding of fonts (by IBA::render_text and oiiotool --text). It now
  honors environment variable `$OPENIMAGEIO_FONTS` and global OIIO attribute
  "font_searchpath" to list directories to be searched when fonts are needed.
  #3096
* We no longer install a FindOpenImageIO.cmake module. It was incomplete, out
  of date, and wholly unnecessary now that we correctly export a config file
  OpenImageIOConfig.cmake and friends. #3098
* When building against OpenEXR 3.1+, use of the OpenEXRCore library no longer
  requires a build-time option, but instead is always available (though off by
  default) and can be enabled by an application setting the OIIO global
  attribute "openexr:core" to 1. #3100
* dev: Timer::add_seconds and add_ticks methods. #3070
* dev: Add `round_down_to_multiple()` and improve `round_to_multiple()` to
  correctly handle cases where the value is less than 0. #3104

Release 2.3 (1 Sept 2021) -- compared to 2.2
----------------------------------------------
New minimum dependencies and compatibility changes:
* C++ standard: **C++14 is now the minimum (gcc 6.1 - 11.2, clang 3.4 - 12,
  MSVS 2017 - 2019, icc 17+).** The default C++ standard mode, if none is
  explicitly specified, is now C++14. #2918 (2.3.4) #2955 #2977 (2.3.5)
* FFMmpeg (optional) dependency minimum is now 3.0 (raised from 2.6). #2994
* OpenCV (optional) dependency minimum is now 3.0 (raised from 2.0). #3015

New major features and public API changes:
* Changes and clarifications to `geterror()` in all classes that have one:
    - `geterror()` now takes an optional `clear` parameter controls if the
      pending error is cleared as well as retrieved (default `true`).
    - All classes with `geterror()` are ensured to have `has_error()`.
    - `geterror()` appends to the pending error message, if one is already
      present but not retrieved. Appending errors will be automatically
      separated by newlines, also any newline at the end of a geterror
      call will be stripped. #2740 (2.3.0.1)
* ImageInput error messages are now thread-specific. This prevents multiple
  threads simultaneously reading from the same ImageInput from getting the
  other thread's error messages. But it means you must always retrieve an
  error with `getmessage()` from the same thread that made the read call
  that generated the error. #2752 (2.3.0.1)
* ImageInput and ImageOutput have removed several fields (like the m_mutex)
  and instead now use a PIMPL idiom that hides internals better from the
  ABI. If you had a custom ImageInput/Output class that directly accessed
  the m_mutex, replace it instead with calls to ImageInput::lock() and
  unlock() (and ImageOutput). #2752 (2.3.1.0)
* Clarify that ImageBuf methods `subimage()`, `nsubimages()`, `miplevel()`,
  `nmipevels()`, and `file_format_name()` refer to the file that an ImageBuf
  was read from, and are thus only meaningful for ImageBuf's that directly
  read from files. "Computed" or copied ImageBuf's are solo images in memory
  that no longer correspond to a file even if the input to the computation
  was from a file. #2759 (2.3.0.1/2.2.9)
* New `get_extension_map()` returns a map that list all image file formats
  and their presumed file extensions. #2904 (2.3.4)
* Overhaul of how we handle "thumbnails" (small preview images embedded in
  the headers of some image file formats) #3021 (2.3.7):
    - Thumbnails no longer embedded in the ImageSpec as "thumbnail_image"
      metadata of a big character array blob.
    - ImageInput, ImageBuf, and ImageCache have varieties of `get_thumbnail()`
      method that returns the thumbnail as an ImageBuf. If this is not
      called, ideally the reader will not undergo the expense of reading and
      storing thumbnail data.
    - ImageOutput and ImageBuf have `set_thumbnail()` to communicate a
      thumbnail image as an ImageBuf.
    - The net effect is that reading files and retrieving ImageSpec's should
      be more efficient for apps that don't have a use for thumbnails.
* Significant improvements to UDIM handling in ImageCache/TextureSystem:
    - New UDIM texture name patterns recognized: `%(UDIM)d` is the Houdini
      convention, and `_u##v##` is for Animal Logic's internal renderer.
      #3006 (2.2.16/2.3.6)
    - It is now permissible for `get_texture_info()/get_image_info()` to
      retrieve metadata for UDIM patterns -- previously it failed, but now
      it will succeed in retrieving any metadata as long as it is present
      and has the same value in all the matching "UDIM tile" panels. #3049
      (2.3.7)
    - TextureSystem now exposes methods `is_udim()`, `resolve_udim()`,
      `inventory_udim()` that should be helpful for apps dealing with UDIM
      textures. See the documentation for details. #3054 (2.3.7)
    - Performance improvements when using UDIM textures. #3049 (2.3.7)
* ImageBuf, when "wrapping" an app-owned buffer, now allows explicit
  specification of stride lengths. This allows you to wrap a buffer that
  has internal padding or other non-contiguous spacing of pixels, scanlines,
  or image planes. #3022 (2.3.6)
* oiiotool new commands and options:
    - `--pastemeta` takes two images as arguments, and appends all the
      metadata (only) from the first image onto the second image's pixels
      and metadata, producing a combined image. #2708 (2.3.0.0)
    - `--chappend` and `--siappend` both allow an optional modifier `:n=`
      to specify the number of images from the stack to be combined
      (default n=2). #2709 (2.3.0.0)
    - `--fit` now takes an additional optional modifier: `fillmode=` with
      choices of `letterbox` (default), `width`, and `height`. #2784 (2.3.2.0)
    - `--autocc` now has an optional modifier `:unpremult=1` that causes
      any color transformations related to autocc to unpremultiply by alpha
      before the transformation and then re-premultiply afterwards, exactly
      the same control that exists for individual `--colorconvert` but never
      existed for autocc. #2890 (2.3.3)
    - `--list-formats` lists all the image file formats that OIIO knows
      about, and for each, the associated file extensions. #2904 (2.3.4)
    - `--skip-bad-frames` causes an error (such as an input file not being
      found) to simply skip to the next frame in the frame range loop, rather
      that immediately exiting. #2905 (2.3.4)
    - When doing expression substitution, `{getattribute(name)}` will be
      replaced by the value that `OIIO::getattribute(name, ...)` would
      retrieve.  #2932 (2.3.4)
    - `--missingfile` (which takes a subsequent argument of `error`, `black`,
      or `checker`) determines the behavior when an input image file is
      missing (the file does not exist at all, does not include cases where
      the file exists but there are read errors). The default value of
      `error` matches the old behavior: report an error and terminate all
      command processing. Other choices of `black` or `checker` will continue
      processing but substitute either a black or checkerboard image for the
      missing file. #2949 (2.3.4)
    - `--printinfo` prints verbose metadata info about the current top
      image on the stack. #3056 (2.3.7)
    - `--printstats` prints statistics about the current top image on the
      stack, and optionally can limit the statistics to a rectangular
      subregion of the image. #3056 (2.3.7)
    - Expanded expression now support the following new metadata notations:
      `META`, `METABRIEF`, and `STATS`. #3025 (2.3.6)
    - `--mosaic` now takes optional `fit=WxH` modifier that lets you set the
      "cell" size, with all constituent images resized as needed (similarly
      to if you used `--fit` on each individually). This is helpful for
      creating contact sheets without having to resize separately or to know
      the resolution of the original images. #3026 (2.3.6)
    - REMOVED `--histogram` which had been deprecated and undocumented since
      before OIIO 2.0. #3029 (2.3.6)
* Python bindings:
    - When transferring blocks of pixels (e.g., `ImageInput.read_image()`
      or `ImageOutput.write_scanline()`), "half" pixels ended up mangled
      into uint16, but now they use the correct `numpy.float16` type. #2694
      (2.3.0.0)
    - The value passed to `attribute(name, typedesc, value)` can now be a
      tuple, list, numpy array, or scalar value. #2695 (2.3.0.0)
    - Added Python bindings for the TextureSystem. #2842
    - Add the previously (inadvertently) omitted enum value for
      `ImageBufAlgo.MakeTxBumpWithSlopes`. #2951 (2.3.4)
* Environment variables:
    - `CUE_THREADS` env variable, if set, is now honored to set the default
      size of the OIIO thread pool. This helps to make OIIO-based apps be
      good citizens when run as OpenCue jobs. #3038 (2.3.7)
* Library organization:
    - All the utility classes are now in libOpenImageIO_Util *only* and
      libOpenImageIO depends on and links to libOpenImageIO_Util, rather
      than the utility classes being defined separately in both libraries.
      #2906 (2.3.4)
    - Include file change: `imagebuf.h` no longer includes `imagecache.h`.
      It should never have needed to, since it didn't need any of its
      declarations. Other code that should always have included both headers,
      but inadvertently only included `imagebuf.h`, may now need to add an
      explicit `#include <OpenImageIO/imagecache.h>`. #3036 (2.3.7)
* Important change to `Makefile` wrapper: We have a 'Makefile' that just wraps
  cmake for ease of use. This has changed its practice of putting builds in
  `build/ARCH` to just `build` (and local installs from `dist/ARCH` to `dist`)
  to better match common cmake practice. So where your local builds end up may
  shift a bit. #3057 (2.3.7)
* Deprecations: A number of long-deprecated functions and methods have been
  given deprecation attributes that will cause warnings if you use them. They
  will eventually be removed entirely at the next "breaking" release (3.0,
  whenever that is). #3032 (2.3.7)

Performance improvements:
* Speed up BMP reading by eliminating wasteful allocation and copying
  done on each scanline read. #2934 (2.3.4)
* For `IBA::to_OpenCV()`, improve efficiency for certain image copies. #2944
  (2.3.4) 
* Fix runaway parsing time for pathological XMP metadata. #2968 (2.3.5/2.2.15)
* TextureSystem reduction in overhead when using UDIM textures. #3049 (2.3.7)

Fixes and feature enhancements:
* Fix a situation where if an ImageBuf backed by an ImageCache reads an
  image, then the image changes on disk, then another ImageBuf or ImageCache
  tries to read it, it could end up with the old version. This involved some
  strategic cache invalidation when ImageBuf's write images to disk. #2696
  (2.3.0.0)
* Improve parsing of XMP records in metadata: more correct handling of
  lists/sequences, better inference of types that look like int or float
  (rather than forcing unknown fields into strings), fixed bugs in parsing
  rational values. #2865 (2.2.12/2.3.3)
* ImageBuf/ImageBufAlgo:
    - `IBA::contrast_remap()` fixes bug that could crash for very large
      images #2704 (2.3.0.0)
    - Fix stack overflow crash in IBA::colorconvert of unusually wide images.
      #2716 (2.3.0.1/2.2.8)
    - Fix `IBA::make_texture()` incorrectly setting tile sizes. #2737
      (2.3.0.1/2.2.8)
    - `IBA::make_texture()` now correctly propagates error messages, which
      can be retrieved via the global OIIO::geterror() call. #2747 (2.3.0.1)
    - `IBA::fit()` now takes a `fillmode` parameter that controls exactly
      how the resize will occur in cases where the aspect ratio of the new
      frame doesn't exactly match that of the source image. The old way (and
      the default value now) is "letterbox", but now also "width" and
      "height" modes are allowed. See `fit()` documentation for details.
      #2784 (2.3.2.0)
    - `IBA::fit()` fixes some slight ringing at image edges when using a
      combination of black wrap mode and a filter with negative lobes.
      #2787 (2.3.2.0)
    - Fix: `ociolook()` and `ociofiletransform()` internally reversed the
      order of their `inverse` and `unpremult` arguments, making it hard to
      select the inverse transformation. #2844 (2.3.3/2.2.11)
    - Fix crash for certain calls to `ImageBuf::set_write_format()` when
      writing files that support per-channel data types. #2885 (2.3.3)
    - Fix: `IBA::fillholes_pushpull` did not correctly understand which
      channel was alpha when generating subimages. #2939 (2.3.4)
    - Fix: `IBA::render_text` did not properly account for non-1 alpha of
      the text color. #2981 (2.3.5/2.2.15)
    - `IBA::colorconvert`, `colormatrixtransform`, `ociolook`, `ociodisplay`,
      and `ociofiletransform` have been fixed so that if input is more than
      4 channels, the additional channels will be copied unchanged, rather
      than inadvertently set to 0. #2987 (2.3.5/2.2.16)
    - Thread safety has been improved for `ImageBuf::init_spec()` and `read()`
      (though no problem was ever reported in the wild). #3018 (2.3.6)
    - `render_text()` now accepts text strings with embedded linefeeds and
      will turn them into multiple lines of rendered text. #3024 (2.3.6)
* ImageCache/TextureSystem/maketx:
    - Fix ImageCache bug: add_tile/get_tile not properly honoring when
     `chend < chbegin` it should get all channels. #2742 (2.3.0.1/2.2.8)
    - `ImageBufAlgo::make_texture()` (as well as `maketx` and `oiiotool -otex`)
      clamp `half` values to their maximum finite range to prevent very large
      float inputs turning into `Inf` when saved as half values. #2891 (2.3.3)
    - Fix crash when sampling non-zero-base channels. #2962 (2.3.5/2.2.15)
    - `IBA::make_texture()` rejects "deep" input images, since they cannot
      be made into textures. Doing this could previously crash. #2991
      (2.3.5/2.2.16)
    - maketx and `oiiotool -otex` have fixed double printing of error
      messages #2992 (2.3.5).
    - Making bumpslopes textures now allows scaled slopes UV normalization.
      This is exposed as new maketx argument `--uvsopes_scale`, or passing
      the attribute `uvslopes_scale` (int) to make_texture(). #3012 (2.3.6)
    - There is a new variety of ImageCache::invalidate() that takes an
      `ImageHandle*` argument instead of a filename. #3035 (2.3.7)
* oiiotool:
    - `--resize` of images with multi-subimages could crash. #2711 (2.3.0.0)
    - Improve oiiotool's guessing about the desired output format based on
      inputs (in the absence of `-d` to specify the format). #2717
      (2.3.0.1/2.2.8)
    - `--text` now accepts text strings with embedded linefeeds and
      will turn them into multiple lines of rendered text. #3024 (2.3.6)
* BMP
    - Fix reading BMP images with bottom-to-top row order. #2776
      (2.3.1.1/2.2.9)
    - Correctly read BMP images of the older V1 variety without crashing.
      #2899 (2.3.3/2.2.13)
    - Fix error in the rightmost pixel column when reading 4 bpp images with
      odd horizontal resolution. #2899 (2.3.3/2.2.13)
    - BMP reads now return metadata "bmp:bitsperpixel" (only when not 24
      or 32) to indicate non-whole-byte channels sizes in the file, and
      "bmp:version" to indicate the version of the BMP format. #2899
      (2.3.3/2.2.13)
    - Speed up BMP reading by eliminating wasteful allocation and copying
      done on each scanline read. #2934 (2.3.4)
    - For BMP files that are 8 bits per pixel and all palette entries have
      R == G == B values, read the file as an 8-bit grayscale image instead
      of needlessly promoting to a full RGB 3-channel image. #2943 (2.3.4)
    - Full support for reading RLE-compressed BMP images. #2976 (2.3.5/2.2.15)
    - Write single channel BMP as 8 bit palette images. #2976 (2.3.5/2.2.15)
* DPX
    - Output to DPX files now supports IOProxy. (Input already did.) #3013
      (2.2.17/2.3.6)
* FFMpeg/movies:
    - Avoid potential crash when a frame can't be read. #2693 (2.3.0.0)
    - Several varieties of encoded videos with 12 bits per channel and
      having alpha were incorrectly reported as 8 bits and without alpha.
      #2989 (2.3.5/2.2.16)
* GIF
    - Support UTF-8 filenames on Windows for GIF files. #2777 (2.3.2.0)
    - Fix error checking for non-existent GIF files. #2886 (2.3.3)
* HEIC
    - Fix error decoding Apple HEIF files. #2794/#2809 (2.3.2.0)
    - Better valid_file() check for HEIF. #2810 (2.3.2.0)
    - Enabled AVIF decoding of heic files (requires libheif >= 1.7 and for
      it to have been built with an AV1 encoder/decoder). #2811 #2812 #2814
      #2818 (2.3.3.0)
* IFF
    - Fix broken reads of 16 bit iff files. #2736 (2.3.0.1/2.2.8)
* JPEG
    - Allow reading of JPEG files with mildly corrupted headers. #2927 (2.3.4)
* OpenEXR:
    - Fix rare crash that was possible when multithreaded writing openexr
      files. #2781 (2.3.2.0)
    - Improved error reporting when errors are encountered writing OpenEXR
      files. #2783 (2.3.2.0)
    - Fix potential crash parsing OpenEXR header that contains Rational
      attributes with certain values. #2791 (2.2.10/2.3.2)
    - EXPERIMENTAL: When building against OpenEXR 3.1, the OIIO CMake option
      `-DOIIO_USE_EXR_C_API=ON` will use a new OpenEXR API that we think
      will allow higher performance texture reads in a multithreaded app.
      This has not yet been benchmarked or tested thoroughly. #3009 #3027
      (2.3.6)
    - The reader no longer renames file metadata "version" into the special
      "openexr:version" that would indicate the OpenEXR file format version
      of the file. That's never what it meant! It really was just arbitrary
      metadata. #3044 (2.3.7)
* PNG
    - Read Exif data from PNG files. #2767 (2.3.1.1/2.2.9)
* PSD
    - Add support for reading ISD profiles for PSD input. #2788 (2.3.2.0)
    - Fix loading PSB files with cinf tags. #2877 (2.2.12/2.3.2)
* RAW:
    - Additional input configuration hints to control options in the
      underlying LibRaw: `"raw:user_flip"` #2769 (2.3.1.0)
      `"raw:balance_clamped"`, `"raw:apply_scene_linear_scale"`,
      `"raw:camera_to_scene_linear_scale"` #3045 (2.3.7)
    - Correctly handle RAW files with Unicode filenames on Windows. #2888
      (2.3.3)
    - Fix garbled output when `raw:Demosaic` hint is `"none"`. #3045 (2.3.7)
* Targa
    - Fix potential crash when reading files with no thumbnail. #2903
      (2.3.3/2.2.13)
    - Fix alpha handling for some files. #3019 (2.3.6)
* TIFF:
    - Fix broken reads of multi-subimage non-spectral files (such as
      photometric YCbCr mode). #2692 (2.3.0.0)
    - Fix spec() and spec_dimensions() for MIPmapped TIFF files, they did
      not recognize being asked to return the specs for invalid subimage
      indices. #2723 (2.3.0.1/2.2.7)
    - Add ability to output 1bpp TIFF files. #2722 (2.3.0.1/2.2.7)
    - Fix reading TIFF files with "separate" planarconfig and rowsperstrip
      more than 1. #2757 (2.3.0.1/2.2.9)
    - Fix incorrect reading of tiled TIFF files using certain rare TIFF
      features that also have a vertical resolution that is not a whole
      multiple of the tile size. #2895 (2.3.3/2.2.13)
    - Support IOProxy for reading TIFF files. #2921 (2.3.4)
    - TIFF plugin now properly honors caller request for single-threaded
      operation. #3016 (2.3.6)
* WebP:
    - Add support for requesting compression "lossless". #2726 (2.3.0.1/2.2.8)
    - Input improvements including: RGB images are kept as RGB instead of
      always adding alpha; more efficient by skipping alpha premultiplication
      when it's unnecessary; now can read animated WebP images as
      multi-subimage files. #2730 (2.3.0.1/2.2.8)
* Fix memory leak during decoding of some invalid Exif blocks. #2824
* Fix possible divide-by-zero error in read_image/read_scanlines for invalid
  image sizes (usually from corrupt files). #2983 (2.3.5/2.2.16)

Developer goodies / internals:
* Internals now use C++11 `final` keywords wherever applicable. #2734
  (2.3.0.1)
* More internals conversion of old Strutil::sprintf to Strutil::fmt::format
  and related changes. #2889 (2.3.3)
* Redundant format conversion code removed from imageio.cpp #2907 (2.3.4)
* Eliminate direct output to std::cerr and std::cout by library calls.
  #2923 (2.3.4)
* argparse.h:
    - ArgParse::abort() lets the response to a command line argument signal
      that no further arguments should be parsed. #2820 (2.3.3/2.2.11)
* color.h:
    - New `ColorConfig::OpenColorIO_version_hex()` returns the hex code for
      the version of OCIO we are using (0 for no OCIO support). #2849 (2.3.3)
* farmhash.h:
    - Clean up all non-namespaced preprocessor symbols that are set
      by this header and may pollute the caller's symbols. #3002 (2.2.16/2.3.6)
* filesystem.h:
    - New Filesystem::generic_filepath() returnss a filepath in generic
      format (not OS specific). #2819 (2.3.3/2.2.11)
    - Improve exception safety in Filesystem directory iteration. #2998
      (2.2.16/2.3.6)
    - New `filename_to_regex()` makes a filename "safe" to use as a
      regex pattern (for example, properly backslashing any `.` characters).
      #3046 (2.3.7)
    - Some methods that used to take a `const std::string&` now take a
      `string_view`. #3047 (2.3.7)
* fmath.h:
    - Use CPU intrinsics to speed up swap_ending (by 8-15x when swapping
      bytes of large arrays). #2763 (2.3.1.0)
* hash.h:
    - `farmhash::inlined::Hash` now is constexpr and works for Cuda.
      #2843 (2.3.3) #2914 #2930 (2.3.4)
* oiioversion.h:
    - New macros `OIIO_VERSION_GREATER_EQUAL` and `OIIO_VERSION_LESS`.
      #2831 (2.3.3/2.2.11)
* platform.h:
    - New macro OIIO_INLINE_CONSTEXPR, equivalent to `inline constexpr` for
      C++17, but just constexpr for C++ <= 14. #2832 (2.3.3/2.2.11)
* simd.h:
    - Fix incorrect ARM NEON code in simd.h. #2739 (2.3.0.1/2.2.8)
* span.h:
    - `std::size()` and `std::ssize()` should work with OIIO::span now.
      #2827 (2.3.3/2.2.11)
* string_view.h:
    - `std::size()` and `std::ssize()` should work with OIIO::string_view
      now. #2827 (2.3.3/2.2.11)
    - More thorough constexr of string_view methods. #2841 (2.3.3)
* strongparam.h:
    - New StrongParam helper for disambiguating parameters. #2735 (2.3.2)
* strutil.h:
    - Strutil `splits()` and `splitsv()` should return no pieces when passed
      an empty string. (It previously erroneously returned one piece
      consisting of an empty string.) #2712 (2.3.0.0)
    - Fix build break when strutil.h was included in Cuda 10.1 code. #2743
      (2.3.0.1/2.2.8)
    - `strhash()` is now constexpr for C++14 and higher. #2843 (2.3.3)
    - New Strutil functions: find, rfind, ifind, irfind #2960 (2.3.4/2.2.14)
      contains_any_char #3034 (2.3.7) rcontains, ircontains #3053 (2.3.7)
* sysutil.h:
    - Extend `getenv()` to take a default if the environment variable is not
      found. #3037 #3040 (2.3.7)
* typedesc.h:
    - `TypeDesc::basetype_merge(a,b)` returns a BASETYPE having the
      precision and range to hold the basetypes of either `a` or `b`.
      #2715 (2.3.0.0)
    - TypeDesc can now describe 2D and 3D bounding boxes, as arrays of 2
      VEC2 aggregates (for 2D) or VEC3 aggregates (for 3D) with "BOX"
      semantic. The shorthand for these are `TypeBox2`, `TypeBox3` (for
      float), and `TypeBox2i` and `TypeBox3i` for integer or pixel coordinate
      boxes. #3008 (2.2.17/2.3.6)
* unordered_map_concurrent.h:
    - New methods find_or_insert, nobin_mask(). #2867 (2.2.12/2.3.3)
* ustring.h:
    - ustring internals now have a way to ask for the list of ustrings whose
      hashses collided.  #2786 (2.2.11/2.3.2.0)
    - ustring now guarantees that no two ustrings will return the exact same
      value for `hash()`. #2870 (2.3.3)
    - ustring now explicitly disallows embedded NUL (0) characters in the
      middle of a string. A ustring constructed from such a thing will
      truncate the string after the first NUL. #3326 (2.4.0.2)

Build/test system improvements and platform ports:
* CMake build system and scripts:
    - Instead of defaulting to looking for Python 2.7, the OIIO build now
      defaults to whatever Python is found (though a specific one can still
      be requested via the PYTHON_VERSION variable). #2705 (2.3.0.0/2.2.8)
      #2764 (2.3.0.1/2.2.8)
    - Make the OIIO CMake files work properly if OIIO is a subproject. Also
      various other CMake script refactoring. #2770 (2.3.1.1/2.2.9)
    - Extend checked_find_package with VERSION_MIN and VERSION_MAX #2773
      (2.3.1.1/2.2.9), DEFINITIONS and SETVARIABLES #3061 (2.3.7)
    - No longer directly link against python libraries when unnecessary.
      #2807 (2.2.11/2.3.3)
    - On Windows, fix some linkage problems by changing the pybind11
      bindings to make a CMake "shared" library rather than "module". Sounds
      wrong, but seems to work. We will reverse if this causes problems.
      #2830 (2.3.3/2.2.11)
    - Improvements to building or linking static libraries. #2854 (2.2.12/2.3.3)
    - Change default STOP_ON_WARNING to OFF for release branches (including
      this one) so that small change in compiler warnings after our release
      don't break anybody's builds. (Though we still stop on warnings for CI
      builds). #2861 (2.2.12/2.3.3)
    - The pkgconfig OpenImageIO.pc was specifying the include path
      incorrectly. #2869 (2.2.12/2.3.3)
    - Support for CMake 3.20. #2913 #2931 (2.3.4)
    - Be sure to have the namespace include the patch number for pre-release
      builds from the master branch. #2948 (2.3.4)
    - Use modern style cmake targets for PNG and ZLIB dependencies. #2957
      (2.3.4)
    - Propagate C++14 minimum requirement to downstream projects via our
      cmake config exports. #2965 (2.3.5)
    - Fix exported cmake config files, which could fail if Imath and OpenEXR
      weren't the at the same version number. #2975 (2.3.5/2.2.15)
    - Change default postfix for debug libraries to `_d`. (2.3.5)
    - Our CMake `checked_find_package` is now able to be requested to favor
      an exported config file, if present, on a package-by-package basis.
      #2984 (2.3.5/2.2.15)
    - If a package is requested to be disabled, skip its related tests rather
      than reporting them as broken. #2988 (2.3.5/2.2.16)
    - Better support for running testsuite when the build dir in odd places.
      #3065 #3067 (2.3.7.1)
    - To prevent accidental overwrite of sensitive areas (such as
      /usr/local), you now need to explicitly set CMAKE_INSTALL_PREFIX if you
      want the "install" to not be local to the build area. #3069 (2.3.7.1)
* Dependency version support:
    - C++20 is now supported. #2891 (2.3.3)
    - Fix deprecation warnings when building with very new PugiXML versions.
      #2733 (2.3.0.1/2.2.8)
    - Fixes to build against OpenColorIO 2.0. #2765 (2.3.0.1/2.2.8) #2817
      #2849 (2.3.3/2.2.11) #2911 (2.3.4)
    - Fix to accommodate upcoming OpenColorIO 2.1 deprecation of
      parseColorSpaceFromString. #2961 (2.3.5/2.2.15)
    - Work to ensure that OIIO will build correctly against Imath 3.0 and
      OpenEXR 3.0, as well as Imath 3.1 / OpenEXR 3.1. #2771 (2.3.1.1/2.2.9)
      #2876 #2678 #2883 #2894 (2.3.3/2.2.12) #2935 #2941 #2942 #2947 (2.3.4)
    - Better finding of OpenJpeg 2.4. #2829 (2.3.3/2.2.11)
    - On Mac, libheif 1.10 is very broken. Don't use that version. #2847
      (2.3.3/2.2.11)
    - Fix build break against changes coming in future libtiff, where it
      is changing from some libtiff-defined integer types to the equivalent
      stdint.h types. #2848 (2.3.3/2.2.11)
    - Fixes to support the libraw 202101 snapshot (their in-progress 0.21.0).
      #2850 (2.3.3/2.2.11)
    - More clear warnings about using OpenVDB 8+ when building for C++11,
      because OpenVDB 8 requires C++14 or higher. #2860  (2.2.12/2.3.3)
    - More gracefully handle building against a custom Imath/OpenEXR even
      when another exists in the system area. #2876 (2.2.12/2.3.3)
    - Minor fixes to build cleanly against the upcoming Imath 3.0. #2878
      (2.2.12/2.3.3)
    - Remove obsolete dependency on Boost random (now use std::random).
      #2896 (2.3.3)
    - libtiff 4.3 is supported. #2953 (2.3.4)
    - We now include a `build_OpenJPEG.bash` script that can conveniently
      build a missing OpenJPEG dependency. (2.3.5/2.2.16)
    - Changes to make it build against TBB 2021. #2985 (2.3.5/2.2.15)
    - Support for building OIIO with gcc 11. #2995 (2.2.16/2.3.6)
    - Fixes to accommodate Imath 3.1 upcoming changes. #2996 (2.2.16/2.3.6)
    - Finding FFMpeg now correctly detects the version. #2994 (2.2.16/2.3.6)
    - FFMpeg minimum version is now >= 3.0. #2999 (2.3.6)
    - Fixes for detecting and using Ptex, among other things got the version
      wrong. #3001 (2.2.16/2.3.6)
    - Fixes for building against fmt 8.0. #3007 (2.3.6)
    - The OpenCV minimum version is now >= 3.0. #3015 (2.3.6)
    - Fixes to build properly against the upcoming OpenColorIO 2.1. #3050
      (2.3.7)
    - Finding boost is more flexible when desiring static libraries. #3031
      (2.3.7/2.2.17)
    - FindTBB.cmake module updated to create proper targets. #3060 (2.3.7)
    - All the `src/build_scripts/build_*.bash` scripts now honor an env
      variable called `DEP_DOWNLOAD_ONLY`, which if set will only do the
      downloads but not the builds. #3058 #3072 (2.3.7)
    - Better finding of OpenCV on Windows. #3062 (2.3.7.1)
* Testing and Continuous integration (CI) systems:
    - Completely get rid of the old appveyor CI. #2782 (2.3.2.0)
    - Test against libtiff 4.2 in the "latest releases" test. #2792 (2.3.2.0)
    - Got Windows CI fully working, bit by bit. #2796 #2798 #2805 #2821 #2826
      #2834 #2835 #2836 #2838 #2839 #2840 (2.3.3)
    - Reduce redundant verbosty in CI output logs during dependency building.
    - Modify hash_test to verify correctness and stability of the hashes.
      #2853 (2.3.3)
    - When building custom OpenEXR with build_openexr.bash, don't have it
      build the examples. #2857 (2.2.12/2.3.3)
    - Speed up CI by using GitHub 'cache' actions + ccache. #2859 (2.2.12/2.3.3)
    - Separate stages (setup, deps, build, test) into separate GHA "steps"
      for better logging and understanding of the timing and performance.
      #2862 (2.2.12/2.3.3)
    - Now actively testing libheif in Linux CI. #2866 (2.2.12/2.3.3)
    - Remove the last vestiges of Travis-CI, which we no longer use. #2871
      (2.2.12/2.3.3)
    - For failed tests, add CMake cache and log part of the saved artifacts.
      (2.2.12/2.3.3)
    - CI now tests build in C++20 mode. #2891 (2.3.3)
    - Our CI clang-format test now uses LLVM/clang-format 11. #2966
    - Test the clang11 + C++17 combo. #3004 (2.3.6)
* Platform support:
    - Fixes for mingw. #2698 (2.3.0.0)
    - Windows fix: correct OIIO_API declaration on aligned_malloc,
      aligned_free of platform.h. #2701 (2.3.0.0)
    - Fix boost linkage problem on Windows. #2727 (2.3.0.1/2.2.8)
    - Fix warnings when compiling webpinput.cpp on 32 bit systems. #2783
      (2.3.2.0)
    - Fix problems with `copysign` sometimes defined as a preprocessor symbol
      on Windows. #2800 (2.3.2)
    - Fixes related to Mac M1-based systems: Fix crash in ustring internals
      #2990 (2.3.5/2.2.15.1)

Notable documentation changes:
* Make Readthedocs generate downloadable HTML as well as PDF. #2746
* Explain how to read image data into separate per-channel buffers. #2756
  (2.3.0.1/2.2.8)
* Improve use of breathe and formatting. #2762 (2.3.1.0)
* Remove documentation of deprecated ImageBufAlgo functions. #2762 (2.3.1.0)
* Document missing texture option fields. #2762 (2.3.1.0)
* Starting to use "sphinx_tabs" as a clear way to present how things should
  be done for different language bindings. #2768 (2.3.1.0)



Release 2.2.21 (1 Jul 2022) -- compared to 2.2.20
--------------------------------------------------
* BMP: gain the ability to read some very old varieties of BMP files. #3375
* BMP: better detection of corrupted files with nonsensical image dimensions
  or total size. #3434
* BMP: protect against corrupted files that have palette indices out of bound.
  #3435
* ffmpeg: Support for ffmpeg 5.0. #3282
* ffmpeg: protect against possible double-free. #3376
* ffmpeg: make the supported file extension check be case-insensitive. This
  prevents movie files from being incorrectly unable to recognize their format
  if they have the wrong capitalization of the file extension. #3364
* hdr/rgbe files: Avoid possible Windows crash when dealing with characters
  with the high bit set. #3310
* TIFF: fix read problems with TIFF files with non-zero y offset. #3419
* Dev goodies: ustring has added a from_hash() static method #3397, and a
  ustringhash helper class #3436.
* simd.h fixes for armv7 and aarch32. #3361

Release 2.2.20 (1 Feb 2022) -- compared to 2.2.19
--------------------------------------------------
* Fix some address sanitizer failures. #3160
* Build/CI: Deal with OpenColor renaming its master branch to main. #3169
* Windows: Fix error when compiling with MSVC. #3168
* Fix excessive memory usage when saving EXR with many channels. #3176
* TIFF: now works for 16-bit palette images. #3260
* Fix ImageBuf::read bug for images of mixed per-channel data types. #3088

Release 2.2.19 (1 Nov 2021) -- compared to 2.2.18
--------------------------------------------------
* Better catching of exceptions thrown by OCIO 1.x if it encounters 2.0 config
  files. #3089
* Address new warnings revealed by clang 13. #3122
* Fixed some minor python binding bugs. #3074 #3094
* Fix when building with Clang on big-endian architectures. #3133
* Fix occasional build breaks related to OpenCV headers. #3135
* Improvements to NetBSD and OpenBSD support. #3137.
* Fixes to work with the libraw 202110 snapshot. #3143

Release 2.2.18 (1 Sep 2021) -- compared to 2.2.17
--------------------------------------------------
* Honor env variable `CUE_THREADS` (used by OpenCue) to set the default size
  of OIIO's thread pool. #3038
* Compatibility with OpenColorIO 2.1. #3050
* Dev: Extend Sysutil::getenv() to take a default if the environment variable
  is not found. #3047 #3048

Release 2.2.17 (1 Aug 2021) -- compared to 2.2.16
--------------------------------------------------
* Output to DPX files now supports IOProxy. (Input already did.) #3013
* typedesc.h: TypeDesc can now describe 2D and 3D bounding boxes, as arrays
  of 2 VEC2 aggregates (for 2D) or VEC3 aggregates (for 3D) with "BOX"
  semantic. The shorthand for these are `TypeBox2`, `TypeBox3` (for float),
  and `TypeBox2i` and `TypeBox3i` for integer or pixel coordinate
  boxes. #3008
* Build: Fixes for building against fmt 8.0.0. #3007
* Build: Finding boost is more flexible when desiring static libraries. #3031

Release 2.2.16 (1 Jul 2021) -- compared to 2.2.15
--------------------------------------------------
* New UDIM texture name patterns recognized: `%(UDIM)d` is the Houdini
  convention, and `_u##v##` is for Animal Logic's internal renderer. #3006
  (2.2.16)
* When doing color space transforms on images with > 4 channels -- the
  additional channels are now copied unaltered, rather than leaving them
  black. #2987 (2.2.16)
* FFMpeg: fix some encodings that didn't correctly recognize that they were
  more than 8 bits, or had alpha. #2989 (2.2.16)
* farmhash.h: Clean up all non-namespaced preprocessor symbols that are set
  by this header and may pollute the caller's symbols. #3002 (2.2.16)
* Fix crashes on M1 (ARM) based Mac. #2990 (2.2.16)
* Bug fix: avid divide-by-0 error computing chunk size for invalid image
  sizes. #2983 (2.2.16)
* `make_texture` (and `maketx` and `oiiotool -otex`) no longer crash if you
  try to make a texture out of a "deep" image; instead it will return an
  error message. #2991 (2.2.16)
* filesystem.h: Improve exception safety in Filesystem directory iteration.
  #2998 (2.2.16)
* Build: Improve finding of OpenJPEG. #2979 (2.2.16)
* Build: Support for building OIIO with gcc 11. #2995 (2.2.16)
* Build: Fixes to accommodate Imath 3.1 upcoming changes. #2996 (2.2.16)
* Build: Finding FFMpeg now correctly detects the version. #2994 (2.2.16)
* Build: clang + C++17 + LibRaw < 0.20 are mutually incompatible. Detect
  this combination and warn / disable libraw under those conditions. #3003
  (2.2.16)
* Build: Fix CMake behavior for `REQUIRED_DEPS` due to a typo. #3011 (2.2.16)
* Build: Fixes for detecting and using Ptex, among other things got the
  version wrong. #3001 (2.2.16)
* Testing: If a feature is disabled, skip its tests rather than reporting
  them as broken. #2988 (2.2.16)
* CI: Test the combination of clang and C++17. #3003 (2.2.16)

Release 2.2.15.1 (3 Jun 2021) -- compared to 2.2.15.0
-----------------------------------------------------
* Fix crash / misbehavior in ustring internals on Apple M1 ARM. #2990

Release 2.2.15 (1 Jun 2021) -- compared to 2.2.14
--------------------------------------------------
* BMP improvements: now support reading rle-compressed BMP files; writing
  single channel grayscale images now save as 8bpp palette images intead of
  24bpp; and reading 8bpp where all palette entries have R==G==B looks like
  a 1-channel grayscale instead of 3-channel RGB. #2976
* Bug: IBA::render_text did not properly account for alpha of the draw
  color. #2981
* Bug: Fix runaway parsing time for pathological XMP metadata. #2968
* Bug: Fixed a crash is ImageCacheFile::read_unmipped when sampling
* Fix exported cmake config files, which could fail if Imath and OpenEXR
  weren't the at the same version number. #2975
* Build: Modernize cmake to use targets for PNG and ZLIB. #2957
* Build: Fix to accommodate upcoming OpenColorIO 2.1 deprecation of
  parseColorSpaceFromString. #2961
* Build: Changes to make it build against TBB 2021. #2985
* Dev: Add Strutil functions: find, rfind, ifind, irfind. #2960

Release 2.2.14 (1 May 2021) -- compared to 2.2.13
--------------------------------------------------
* JPEG: Improve readin of files with mildly corrupted headers. #2927
* TIFF: Support IOProxy for input. #2921
* BMP: Improve performance by eliminating wasteful per-scanline allocation
  and needless data copying. #2934
* Build/CI: Fix all the build_*.bash scripts to not use cmake --config flag,
  which was harmlessly ignored but is flagged as an error for CMake 3.20.
  #2931
* Build: More fixes related to supporting a wide range of OpenEXR versions,
  and making our exported cmake configs correctly transmit dependencies on
  OpenEXR include paths. #2935 #2941 #2942 #2947
* ImageBufAlgo::fillholes_pushpull: added logic to correctly set the spec's
  alpha_channel field when generating sub-images. #2939
* Python: MakeTxBumpWithSlopes enum value had been inadvertently omitted
  from the Python bindings. #2951

Release 2.2.13 (1 Apr 2021) -- compared to 2.2.12
--------------------------------------------------
* Get ready for upcoming Imath/OpenEXR 3.0 release. #2883 #2894 #2897
* GIF: Fix error checking for non-existent GIF files. #2886
* Fix crash related to ImageBuf:set_write_format() when used in conjunction
  with a file format that doesn't support per-channel data types. #2885
* Make RAW files handle Unicode filenames on Windows. #2888
* Make sure OIIO builds cleanly with C++20. #2891
* BMP: Several bug fixes when reading an older (V1) variety of BMP files. 
  #2899
* Targa: fix reading tga files with 0-sized thumbnails. #2903
* TIFF: fix reading of certain tiled TIFF files with the vertical image size
  is not a whole multiple of the tile size. #2895
* Avoid OpenColorIO v2 exception when color-conversion of single points (we
  didn't pass a correct stride, thinking that stride isn't used for a single
  point). #2911
* make_texture: When outputting to a 'half' data format file, clamp filtered
  values to the half range so large values don't inadvertently get converted
  to half 'infinite' values. #2892
* Improvements to ustring internals to ensure that no two ustrings ever end
  up with the same hash() value. #2870
* Fixes for compiler errors when compiling farmhash.h using C++11 mode with
  newer gcc (6+). #2914

Release 2.2.12 (1 Mar 2021) -- compared to 2.2.11
--------------------------------------------------
* Bug fix: Improve parsing of XMP records in metadata: more correct handling
  of lists/sequences, better inference of types that look like int or float
  (rather than forcing unknown fields into strings), fixed bugs in parsing
  rational values. #2865
* Bug fix: Fix loading PSB files with cinf tags. #2877
* Build: Improvements to building or linking static libraries. #2854
* Build: Change default STOP_ON_WARNING to OFF for release branches
  (including this one) so that small change in compiler warnings after our
  release don't break anybody's builds. (Though we still stop on warnings
  for CI builds). #2861
* Build: More clear warnings about using OpenVDB 8+ when building for C++11,
  because OpenVDB 8 requires C++14 or higher. #2860
* Build: The pkgconfig OpenImageIO.pc was specifying the include path
  incorrectly. #2869
* Build: More gracefully handle building against a custom Imath/OpenEXR even
  when another exists in the system area. #2876
* Build: Minor fixes to build cleanly against the upcoming Imath 3.0. #2878
* Dev: hash.h: Make many of the hash functions constexpr. #2843
* Dev: Better unit tests to verify correctness and stability over time of
  the hash functions. #2853
* Dev: unordered_map_concurrent.h: New methods find_or_insert, nobin_mask().
  #2867
* CI: Speed up CI builds by not building OpenEXR example programes. #2857
* CI: Speed up CI by using GitHub 'cache' actions + ccache. #2859
* CI: Separate stages (setup, deps, build, test) into separate GHA "steps"
  for better logging and understanding of the timing and performance. #2862
* CI: Now actively testing libheif in Linux CI. #2866
* CI: Remove the last vestiges of Travis-CI, which we no longer use. #2871
* CI: For failed tests, add CMake cache and log part of the saved artifacts.
* PSA: Avoid libheif 1.10 on Mac, it is broken. Libheif 1.11 is fine.

Release 2.2.11.1 (1 Feb 2021) -- compared to 2.2.11.0
-----------------------------------------------------
* Fix build break against Qt 5.15.2 (deprecated enum). #2852

Release 2.2.11 (1 Feb 2021) -- compared to 2.2.10
--------------------------------------------------
* Enabled AVIF decoding of heic files (requires libheif >= 1.7 and for it
  to have been built with an AV1 encoder/decoder). #2811 #2812 #2814 #2818
* `oiiotool --help` now prints the OCIO version (where it prints the config
  file and known color space). #2849
* Bug fix: ImageBufAlgo::ociolook() and ociofiletransform() internally
  reversed the order of their `inverse` and `unpremult` arguments, making it
  hard to select the inverse transformation. #2844
* Fix memory leak during decoding of some invalid Exif blocks. #2824
* Build: Fixed warnings when building against python 2.x. #2815
* Build: No longer directly link against python libraries when unnecessary.
  #2807
* Build: Better finding of OpenJpeg 2.4. #2829
* Build: On Windows, fix some linkage problems by changing the pybind11
  bindings to make a CMake "shared" library rather than "module". Sounds
  wrong, but seems to work. We will reverse if this causes problems. #2830
* Build: On Mac, libheif 1.10 is very broken. Don't use that version. #2847
* Build: Fix build break against changes coming in future libtiff, where it
  is changing from some libtiff-defined integer types to the equivalent
  stdint.h types. #2848
* Build: Some final touches to prepare for release of OpenColor 2.0. #2849
* Build: Fixes to support the libraw 202101 snapshot (their in-progress
  0.21.0). #2850
* CI: Got Windows CI fully working, bit by bit. #2796 #2805 #2821 #2826
  #2834 #2835 #2836 #2840
* Dev: Some internal rearrangement of span.h and string_view.h (that should
  not break source or ABI compatibility). `std::size()` and `std::ssize()`
  should work with OIIO::span and OIIO::string_view now. #2827
* Dev: ustring internals now have a way to ask for the list of ustrings
  whose hashses collided.  #2786
* Dev: New Filesystem::generic_filepath() returnss a filepath in generic
  format (not OS specific). #2819
* Dev: ArgParse::abort() lets the response to a command line argument signal
  that no further arguments should be parsed. #2820
* Dev: In oiioversion.h, added macros `OIIO_VERSION_GREATER_EQUAL` and
  `OIIO_VERSION_LESS`. #2831
* Dev: In platform.h, added macro OIIO_INLINE_CONSTEXPR, which is equivalent
  to `inline constexpr` for C++17, but just constexpr for C++ <= 14. #2832

Release 2.2.10.1 (7 Jan 2021) -- compared to 2.2.10.0
-----------------------------------------------------
* Fix build break against OpenColorIO v2.0 RC1. #2817

Release 2.2.10 (1 Jan 2021) -- compared to 2.2.9
-------------------------------------------------
* GIF: support for UTF-8 filenames on Windows. #2777
* OpenEXR: Fix rare crash during multithreaded output. #2781
* OpenEXR: Fix potential crash parsing OpenEXR header that contains Rational
  attributes with certain values. #2791
* Improved error reporting for IOFile failures to open the file. #2780
* Build: Fix webp compile break on 32 bit systems. #2783
* Build/Windows: Fix symbol definition conflict with pyconfig.h. #2800
* CI: Test the latest fmt, PugiXML, and pybind11 releases. #2778
* Docs: Add explanation of oiiotool -otex modifiers that were missing from
  the docs. #2790  Fix some duplicated text. #2785

Release 2.2.9 (1 Dec 2020) -- compared to 2.2.8
-------------------------------------------------
* TIFF: Fix reading files with "separate" planarconfig and rowsperstrip more
  than 1. #2757 (2.3.0.1/2.2.9)
* RAW: add "raw:user_flip" input configuration hint to control this option
  in the underlying libraw. #2769 (2.3.1.0)
* PNG: Read Exif data from PNG files. #2767
* BMP: Fix reading BMP images with bottom-to-top row order. #2776
* Work to ensure that OIIO will build correctly against the upcoming
  Imath 3.0 and OpenEXR 3.0.
* Make the OIIO CMake files work properly if OIIO is a subproject. Also
  various other CMake script refactoring. #2770

Release 2.2.9 (1 Dec 2020) -- compared to 2.2.8
-------------------------------------------------
* TIFF: Fix reading files with "separate" planarconfig and rowsperstrip more
  than 1. #2757 (2.3.0.1/2.2.9)
* RAW: add "raw:user_flip" input configuration hint to control this option
  in the underlying libraw. #2769 (2.3.1.0)
* PNG: Read Exif data from PNG files. #2767
* BMP: Fix reading BMP images with bottom-to-top row order. #2776
* Work to ensure that OIIO will build correctly against the upcoming
  Imath 3.0 and OpenEXR 3.0. #2771
* Make the OIIO CMake files work properly if OIIO is a subproject. Also
  various other CMake script refactoring. #2770

Release 2.2.8 (1 Nov 2020) -- compared to 2.2.7
-------------------------------------------------
* Fix that ImageBuf images backed by ImageCache, could hold an outdated copy
  of the image if it was in the imagecache once, then changed on disk. #2696
* Fix stack overflow crash in IBA::colorconvert of unusually wide images.
  #2716
* Fix boost linkage problem on Windows. #2727
* Fix broken reads of 16 bit iff files. #2736
* Fix make_texture incorrectly setting tile sizes. #2737
* Fix incorrect ARM NEON code in simd.h. #2739
* Improve oiiotool --chappend and --siappend, allowing an optional modifier
  ":n=" to specify the number of images from the stack to be combined by
  having their channels or subimages appended. #2709
* WebP: add support for requesting compression "lossless". #2726
* Improve build system for finding Python, now if a specific version is not
  requested, default to whichever is found rather than always defaulting to
  Python 2.7. #2705 #2764
* Fix deprecation warnings when building with very new PugiXML versions.
  #2733
* Fix ImageCache bug: add_tile/get_tile not properly honoring when
  `chend < chbegin` it should get all channels. #2742
* Fix build break when strutil.h was included in Cuda 10.1 code. #2743
* Docs: Make readthedocs generate downloadable htm as well as pdf. #2746
* Improve oiiotool's guessing about the desired output format based on
  inputs (in the absence of `-d` to specify the format). #2717
* JPEG output: add support for writing progressive JPEGS (set the
  attribute "jpeg:progressive" to 1). #2749
* WebP input improvements including: RGB images are kept as RGB instead of
  always adding alpha; more efficient by skipping alpha premultiplication
  when it's unnecessary; now can read animated WebP images as multi-subimage
  files. #2730
* Docs: ImageInput chapter now has an example of reading image data into
  separate per-channel buffers. #2756
* Fixes to build against recent changes in OpenColorIO v2 master. #2765

Release 2.2.7 (1 Oct 2020) -- compared to 2.2.6
-------------------------------------------------
* oiiotool new command: `--pastemeta` takes two images as arguments, and
  appends all the metadata (only) from the first image onto the second
  image's pixels and metadata, producing a combined image. #2708
* TIFF: Fix broken reads of multi-subimage non-spectral files (such as
  photometric YCbCr mode). #2692
* Python: When transferring blocks of pixels (e.g., `ImageInput.read_image()`
  or `ImageOutput.write_scanline()`), "half" pixels ended up mangled into
  uint16, but now they use the correct numpy.float16 type. #2694
* Python: The value passed to `attribute(name, typedesc, value)` can now be
  a tuple, list, numpy array, or scalar value. #2695
* `IBA::contrast_remap()` fixes bug that could crash for very large images
  #2704
* Warn about recommended minimum versions of some dependencies.
* Windows fix: correct OIIO_API declaration on aligned_malloc, aligned_free
  of platform.h. #2701
* Fix oiiotool crash when --resize was used with multi-subimage files. #2711
* Bug fix in Strutil::splits and splitsv: when input is the empty string,
  the split should return no pieces. #2712
* Support for libheif 1.9. #2724
* TIFF: Fix spec() and spec_dimensions() for MIPmapped TIFF files, they
  did not recognize being asked to return the specs for invalid subimage
  indices. #2723
* TIFF: add ability to output 1bpp TIFF files. #2722


Release 2.2 (1 Sept 2020) -- compared to 2.1
----------------------------------------------
New minimum dependencies:
* pybind11 >= 2.4.2
* openjpeg >= 2.0 (if JPEG-2000 support is desired) #2555 (2.2.2)

New major features and public API changes:
* Improved IOProxy support:
    - ImageInput and ImageOutput now have direct API level support for IOProxy
      in their `open()` and `create()` calls, as well as a new `set_ioproxy()`
      method in these classes. #2434 (2.2.0)
    - ImageBuf can now specify a proxy upon construction for reading, and for
      writing via a `set_write_ioproxy()` method that applies to subsequent
      `write` call.  #2477 (2.2.1).
    - DPX input now supports IOProxy. #2659 #2665 (2.2.5)
    - ImageCache (and ImageBuf backed by ImageCache) entries that use IOProxy
      are careful not to fully "close" their proxies when trying to reclaim
      space in the file cache (that would be bad, since the proxy can't be
      re-opened). #2666 (2.2.5)
* Improved support for multi-subimage files:
    - oiiotool: Nearly all operations now allow an optional `:subimages=...`
      modifier that restricts the operation to be performed on only a subset
      of named or indexed subimages. See docs for details. #2582
    - Python `ImageBuf.write()` variety added that takes an open
      `ImageOutput`.  This is the key to writing a multi-subimage file (such
      as a multi-part OpenEXR) using the Python ImageBuf interface. #2640
      (2.2.4)
    - Fixes to `--croptofull` and `-o` with multi-subimages. #2684 (2.2.6)
* Python bindings:
    - Python bindings have been added for missing ParamValue constructors.
      We previously exposed the PV constructors from just a plain int, float,
      or string, but there wasn't an easy way to construct from arbitrary
      data like there is in C++. Now there is. #2417 (2.2.0)
    - `ParamValueList.attribute()`, when being passed attributes containing
      multiple values, now can have those values passed as Python lists and
      numpy arrays (previously they had to be tuples). #2437 (2.1.11/2.2.0)
    - `ImageBufAlgo.color_range_check()` is now available to the Python
      bindings (was previously only C++). #2602 (2.2.3)
    - New variety of `ImageBuf.write()` that takes an open `ImageOutput`.
      This is the key to writing a multi-subimage file (such as a multi-part
      OpenEXR) using the Python ImageBuf interface. #2640 (2.2.4)
* ImageBuf:
    - Easier direct use of IOProxy with ImageBuf: constructor and reset()
      for file-reading ImageBuf now take an optional `IProxy*` parameter,
      and a new `set_write_ioproxy()` method can supply an IOProxy for
      subsequent `write()`. #2477 (2.2.1)
    - Add `ImageBuf::setpixel()` methods that use cspan instead of ptr/len.
      #2443 (2.1.10/2.2.0)
    - Add "missing" `reset()` varieties so that every IB constructor has a
      corresponding `reset()` with the same parameters and vice versa. #2460
* ImageBufAlgo:
    - New `repremult()` is like premult, but will not premult when alpha is
      zero. #2447 (2.2.0)
    - New `max()` and `min()` functions take the pixel-by-pixel maximum
      or minimum of two images. #2470 (2.2.1)
* ColorConfig: add OCIO "role" accessors. #2548
* Low-res I/O of images to terminals that support full color and Unicode
  characters. Just output to a file ending in ".term", and it will convert
  (on certain terminals) to an image displayed directly in the terminal.
  #2631 (2.2.4)
  Try:
      `oiiotool myfile.exr -o out.term`

Performance improvements:
* Greatly improved TextureSystem/ImageCache performance in highly threaded
  situations where access to the cache was a main bottlenecks. In renders of
  scenes with lots of texture access, with dozens of threads all contending
  for the cache, we are seeing some cases of 30-40% reduction in total
  render time. In scenes that are less texture-bottlenecked, or that don't
  use huge numbers of threads, the improvement is more modest. #2433 (2.2.0)

Fixes and feature enhancements:
* oiiotool:
    - Intelligible error messages (rather than crashes) if you attempt to
      create an image too big to fit in memory. #2414 (2.2.0)
    - `--create` and `--proxy` take an additional optional modifier:
      `:type=name` that specifies the type of buffer to be created (the
      default, as usual, is to create an internal float-based buffer). #2414
      (2.2.0)
    - `-o` optional argument `:type=name` is a new (and preferred) synonym
      for what used to be `:datatype=`. #2414 (2.2.0)
    - `--autotrim` now correctly trims to the union of the nonzero regions
      of all subimages, instead of incorrectly trimming all subimages to the
      nonzero region of the first subimage. #2497 (2.2.1.2)
    - `--subimage` now has an optional `:delete=1` modifier that causes the
      operation to delete one named or indexed subimage (versus the default
      behavior of extracing one subimage and deleting the others). #2575
      (2.2.3)
    - The list of dependent libraries (part of `oiiotool --help`) now
      correctly reports the OpenEXR version. #2604 (2.2.3)
    - Fix: `--eraseattrib` did not correctly apply to all subimages when
      `-a` or `:allsubimages=1` were used. #2632 (2.2.4)
* ImageBuf / ImageBufAlgo:
    - Huge ImageBuf allocation failures (more than available RAM) now are
      caught and treated as an ImageBuf error, rather than crashing with an
      uncaught exception. #2414 (2.2.0)
    - ImageBuf constructors that are passed an ImageSpec (for creating an
      allocated writable IB or "wrapping" a user buffer) now check that the
      spec passed has enough information to know the size of the buffer
      (i.e., it will be recognized as an error if the width, height, depth,
      channels, or data type have not been set validly). #2460
    - Fix: `ImageBuf::getchannel()` did not honor its `wrap` parameter.
      #2465 (2.2.1/2.1.12)
    - Fix: `IBA::reorient()` and `IBA::computePixelHashSHA1()` did not honor
      their `nthreads` parameter. #2465 (2.2.1/2.1.12)
    - `resample()` has been modified to more closely match `resize` by using
      clamp wrap mode to avoid a black fade at the outer edge of the
      resampled area. #2481
    - Fix: `ImageBuf::get_pixels()` did not honor the stride parameters.
      #2487. (2.1.12/2.2.1)
    - Fix `resize()` to avoid a crash / stack overflow in certain cases of
      very big images and very large filter kernels. #2643 (2.2.4)
    - Minor improvements to ImageBuf error formatting. #2653 (2.2.5)
* ImageCache / TextureSystem / maketx:
    - New IC/TS attribute "trust_file_extensions", if nonzero, is a promise
      that all files can be counted on for their formats to match their
      extensions, which eliminates some redundant opens and format checks
      in the IC/TS and can reduce needless network/filesystem work. Use with
      caution! #2421 (2.2.0)
    - texture3d() fixed some cases where derivative results were not
      correctly copied to the outputs. #2475 (2.2.1)
    - `maketx`/`IBA::make_texture`: better error detection and messages when
      using "overscan" textures with formats that can't support it properly.
      (Punchline: only OpenEXR textures can do it.) #2521 (2.2.0)
    - Fix possible redundant tile reads in multithread situations (harmless,
      but makes for redundant I/O). #2557 (2.2.2)
* Python:
    - Fixed a bug that lost certain string arguments, especially when passing
      a TypeDesc as its string equivalent. #2587 (2.1.16/2.2.3)
    - Fixed broken bindings of ImageSpec.erase_attribute. #2654
      (2.1.19/2.2.6)
    - Fix missing ImageInput.read_image(). #2677 (2.1.19/2.2.6)
* Exif read: guard better against out of range offsets, fixes crashes when
  reading jpeg files with malformed exif blocks. #2429 (2.1.10/2.2.0)
* Fix: `ImageSpec::erase_attribute()` did not honor its `searchtype`
  parameter. #2465 (2.2.1/2.1.12)
* Fix: Some ColorProcessor::apply() methods were not using their `chanstride`
  parameters correctly. #2475 (2.1.12)
* Fix: iinfo return code now properly indicates failures for files that
  can't be opened. #2511 (2.2.2/2.1.13)
* DPX:
    - IOProxy reading is now supported. #2659 (2.2.5)
    - DPX: Add support for reading DPX files from IOProxy (such as from a
      memory buffer). #2659 #2665 (2.1.19/2.2.6)
* HDR files:
    - Improve performance when reading HDR files out of order (when combined
      with ImageCache, observed to speed up out-of-order HDR reading by 18x).
      #2662 (2.2.5)
* JPEG:
    - Fix resolution unit metadata that was not properly set in JPEG output.
      #2516 (2.2.2/2.1.13)
    - Fix loss of 'config' info upon close/reopen. #2549 (2.2.2)
* OpenEXR:
    - Add support for reading and writing float vector metadata. #2459 #2486
    - Fix bug in the channel sorting order when channels are "X" and
      "Y" (was reversing the order by confusing "Y" for "luminance"). #2595
      (2.1.16/2.2.3)
    - We no longer automatically rename the "worldToNDC" attribute to
      "worldtoscreen" and vice versa. #2609 (2.2.4)
* PNG:
    - Fix loss of 'config' info upon close/reopen. #2549 (2.2.2)
    - Add output configuration hint "png:filter" to control PNG filter
      options. #2650 (2.2.5)
    - Improved propagation of PNG write errors. #2655 (2.2.5)
    - Tell libpng to turn off sRGB profile check, which has a known problem of
      false positives. #2655 (2.2.5)
    - New output option "png:filter" allows control of the PNG filter
      options. #2650 (2.1.19/2.2.6)
* Raw images:
    - Support for new Canon .cr3 file, but only if you build against
      libraw >= 0.20.0 developer snapshot. #2484 (2.2.1) #2613 (2.2.4)
    - RAW input: set the "raw:flip" attribute if the underlying libraw did a
      reorientation. #2572 (2.1.15/2.2.3)
    - Avoid errors (in libraw) that resulted from multiple threads opening
      raw files at the same time. #2633 (2.2.4)
* RLA:
    - Additional sanity checks and error checks/messages for detecting files
      that might be first mistaken for RLA files, but actually are not.
      #2600 (2.2.3)
* TIFF:
    - Internal improvements to handling metadata retrieval for certain
      unusual tags. #2504 (2.2.2/2.1.13)
    - Fix subtle bug when reading Exif directory in the header. #2540
      (2.2.2)
* Video files:
    - Fix possible infinite loop in the FFMpeg-based reader. #2576
      (2.1.15/2.2.3)

Developer goodies / internals:
* argparse.h:
    - Complete overhaul of ArgParse to make it more like Python argparse.
      Please read the extensive comments in argparse.h for documentation.
      For now, the old ArgParse interface still works, but is considered
      deprecated. #2531 (2.2.2) #2618 #2622 (2.2.4)
* attrdelegate.h:
    - New `as_vec<>` method returns the whole attribute as a std::vector.
      #2528 (2.2.2)
* filesystem.h:
    - Catch previously uncaught exceptions that could happen in certain
      Filesystem utility calls. #2522 (2.2.2/2.1.13)
    - New `write_text_file()` convenience function for opening, writing, and
      closing a text file all in one step. #2597 (2.2.3)
* fmath.h:
    - clamp() is 2x faster. #2491 (2.1.12/2.2.2)
    - Very minor fix to OIIO::clamp(), shouldn't affect normal use with
      floats at all, but fixed a subtle quasi-bug in OSL. #2594 (2.1.15/2.2.3)
    - madd() is improved especially on platforms without fma hardware
      #2492 (2.1.12/2.2.2)
    - Perf improvements to `fast_sin`, `fast_cos` #2495 (2.1.12/2.2.2)
    - New `safe_fmod()` is faster than std::fmod. #2495 (2.1.12/2.2.2)
    - New `fast_neg` is faster than simple negation in many cases, if you
      don't care that -(0.0) is 0.0 (rather than a true -0.0). #2495
      (2.1.12/2.2.2)
    - Add vint4, vint8, and vint16 versions of `clamp()`. #2617 (2.2.4)
* oiioversion.h:
    - Fix typo that left the OIIO_VERSION_RELEASE_TYPE symbol undefined.
      #2616 (2.2.4/2.1.16)
    - Add new `OIIO_MAKE_VERSION(maj,min,patch)` macro that constructs the
      proper single integer code for a release version. #2641 (2.2.4/2.1.17)
* paramlist.h:
    - New `ParamValueList::find_pv()` method that is similar to `find()` but
      returns a pointer rather than an iterator and nullptr if the attribute
      is not found. #2527 (2.2.2/2.1.13)
    - Add `get_indexed()` method to ParamValueList and AttrDelegate. #2526
     (2.2.2/2.1.13)
* platform.h:
    - `OIIO_PRETTY_FUNCTION` definition is more robust for weird compilers
      (will fall back to `__FUNCTION__` if all else fails). #2413 (2.2.0)
    - `OIIO_ALIGN` definition is more robust, will fall back to C++11
      alignas when not a compiler with special declspecs (instead of being
      a compile time error!). #2412 (2.2.0)
    - A variety of `OIIO_PRAGMA_...` macros have been added to help deal
      with compiler-specific pragmas. #2467 (2.2.1)
* simd.h:
    - vfloat3 has added a `normalize()`, `length()`, and `length2()`
      methods, to more closely match the syntax of Imath::Vec3f. #2437
      (2.1.11/2.2.0)
    - fix errors in vbool == and !=. #2463 (2.1.11/2.2.1)
    - Add float3 versions of abs, sign, ceil, floor, and round (they already
      existed for float4, float8, float16, but not float4). #2612 (2.2.4)
    - Improved support for ARM NEON SIMD (caveat: this is still not well
      tested). #2614 (2.2.4)
    - Improve performance for many float8/int8 functions and operators when
      running on only 4-wide hardware, by using two 4-wide instructions
      instead of reverting to scalar. #2621
* span.h:
    - Allow the constructor from `std::vector` to allow vectors with custom
      allocators. #2533 (2.2.2)
* strutil.h / ustring.h:
    - New `Strutil::concat()` and `ustring::concat()` concatenate two
      strings, more efficiently than `sprintf("%s%s")` by avoiding any
      unnecessary copies or temporary heap allocations. #2478 (2.2.1)
    - Strutil::upper() and lower() return all-upper and all-lowercase
      versions of a string (like `to_lower` and `to_upper`, but not in-place
      modifications of the existing string). #2525 (2.2.2/2.1.13)
    - `Strutil::repeat()` has been internally rewritten to more efficient by
      avoiding any unnecessary copies or temporary heap allocations. #2478
      (2.2.1)
* typedesc.h:
    - TypeDesc has additional helpers of constexpr values TypeFloat2,
      TypeVector2, TypeVector4, TypeVector2i, TypePointer. #2592 (2.1.16/2.2.3)
* unordered_map_concurrent.h:
    - Fix missing decrement of `size()` after `erase()`. #2624 (2.2.4)
* More reshuffling of printf-style vs fmt-style string formatting. #2424
  (2.2.0) #2649 (2.2.4)
* Internals: changed a lot of assertions to only happen in debug build mode,
  and changed a lot that happen in release builds to only print the error
  but not force a termination. #2435 (2.1.11/2.2.0)
* Internals: Replaced most uses of `boost::thread_specific_ptr` with C++11
  `thread_local`. #2431 (2.2.0)
* oiiotool: Big overhaul and simplification of internals. #2586 #2589 (2.2.3)

Build/test system improvements and platform ports:
* CMake build system and scripts:
    - New non-default CMake build flag `EXTRA_WARNINGS`, when turned on, will
      cause gcc and clang to compile with -Wextra. This identified many new
      warnings (mostly about unused parameters) and fixes were applied in
      #2464, #2465, #2471, #2475, #2476. (2.2.1)
    - FindOpenColorIO.cmake now correctly discerns the OCIO version (2.2.1),
      and now sets up a true imported target. #2529 (2.2.2)
    - FindOpenEXR.cmake has better detection of debug openexr libraries.
      #2505 (2.2.2/2.1.13)
    - Additional cmake controls to customize required vs optional
      dependencies: `REQUIRED_DEPS` (list of dependencies normally optional
      that should be treated as required) and `OPTIONAL_DEPS` (list of
      dependencies normally required that should be optional). The main use
      case is to force certain optional deps to be required for your studio,
      to be sure that missing deps are a full build break, and not a
      successful build that silently lacks features you need. #2507
      (2.2.2/2.1.13)
    - Fix exported cmake config file, it was not ensuring that the Imath
      headers properly ended up in the config include path. #2515
      (2.2.2/2.1.13)
    - Change all CMake references to PACKAGE_FOUND to Package_Found (or
      whatever capitalization matches the actual package name). #2569 (2.2.2)
    - The exported CMake config files now set cmake variable
      `OpenImageIO_PLUGIN_SEARCH_PATH` #2584 (2.1.16/2.2.3)
    - Improved hints printed about missing dependencies. #2682 (2.2.6)
* Dependency version support:
    - Pybind11 is no longer auto-downloaded. It is assumed to be
      pre-installed. A script `src/build-scripts/build_pybind11.bash` is
      provided for convenience if you lack a system install. #2503 (2.2.2)
      Bump the minimum pybind11 version that we accept, to 2.4.2 #2453,
      and add fixes to allow support of pybind11 2.5. #2637 (2.2.4)
    - fmt libray: Un-embed fmt headers. If they are not found on the system
      at build time, they will be auto-downloaded. #2439 (2.2.0)
    - Support for building against libraw 0.20. #2484 (2.2.1) #2580 (2.2.3)
    - Build properly against OpenColorIO's current master (which is the
      in-progress work on OCIO v2). #2530 (2.2.2)
    - Fix static boost to not overlink on Windows. #2537 (2.2.2)
    - Fix build breaks against TOT libtiff master, which had `#define`
      clashes with our GPSTag enum values. #2539 (2.2.2)
    - Ensure compatibility and clean builds with clang 10. #2518 (2.2.2/2.1.3)
    - Support verified for gcc 10, added to CI tests. #2590 (2.2.3)
    - Support for Qt 5.15. #2605 (2.2.3)
    - Fixes to support OpenColorIO 2.0. #2636 (2.2.4)
    - Build against more recent versions of fmtlib. #2639 (2.2.4)
    - Included scripts to download and build libtiff #2543 (2.1.13/2.2.2),
      PugiXML #2648 (2.2.4), zlib, libpng, libjpeg-turbo. #2663 (2.2.5)
    - Minor fixes for libheif 1.8. #2685 (2.2.6)
    - Add a build_libtiff.bash script to make it easy to build the libtiff
      dependency. #2543 (2.1.13/2.2.2)
    - "tinyformat" is no longer used, even optionally. We have switched
      entirely to fmtlib, which is more similar to the upcoming C++20
      std::format. #2647 (2.2.4)
* Testing and Continuous integration (CI) systems:
    - Mostly retire TravisCI for ordinary Linux x64 and Mac builds, now we
      rely on GitHub Actions CI. Nightly test added. Use ASWF docker images
      to test exactly against VFX Platform 2019 and 2020 configurations.
      #2563 (2.2.2) #2579 (2.2.3)
    - Add Travis test for arm64 (aka aarch64) builds. This is still a work
      in progress, and not all testsuite tests pass. #2634 (2.2.4)
    - Our CI tests now have a "bleeding edge" matrix entry that tests against
      the current TOT master build of libtiff, openexr (#2549), and pybind11
      (#2556). (2.2.2)
    - GitHub CI tests, when they fail, leave behind an "artifact" tar file
      containing the output of the tests, so that they can be easily
      downloaded and inspected (or used to create new reference output).
      #2606 (2.2.4)
    - CI Mac tests switch to Python 3.8. (2.2.4)
    - Windows CI switched from using Vcpkg to building its own dependencies.
      #2663 (2.2.5)
    - Testing of TGA now assumes the test images are in the oiio-images
      project, not separately downloaded (the download location disappeared
      from the net). #2512 (2.2.2)
    - Beef up OpenEXR compliance tests, many more examples from
      openexr-images, including many corrupted image failure cases. #2607
      (2.2.4)
* Progress on support for using Conan for dependency installation. This is
  experimental, it can't yet build all dependencies. Work in progress.
  #2461 (2.2.1)
* The version of gif.h that we embed for GIF output has been updated.
  #2466 (2.2.1)
* The `farmhash` functions have been cleaned up to be more careful that none
  of their internal symbols are left visible to the linker. #2473 (2.2.1)
* Clarification about .so name versioning: In supported releases, .so
  contains major.minor, but in master (where ABI is not guaranteed stable,
  we name major.minor.patch). #2488 (2.2.1)
* Protect against certain compiler preprocessor errors for user programs
  that include strutil.h but also include `fmt` on its own. #2498.
  (2.1.12/2.2.2)
* Build: All the `build_foo.bash` helper scripts now use `set -ex` to ensure
  that if any individual commands in the script fails, the whole thing will
  exit with a failure. #2520 (2.2.2/2.1.3)
* Fix compiler warning about incorrect extra braces. #2554 (2.2.2)
* All build-scripts bash scripts now use /usr/bin/env to find bash. #2558
  (2.2.2)
* Avoid possible link errors by fully hiding IBA functions taking IplImage
  parameters, when no OpenCV headers are encountered. #2568 (2.2.2)
* In (obsolete) FindOpenImageIO.cmake, avoid CMake warnings by changing
  the name `OPENIMAGEIO_FOUND` -> `OpenImageIO_FOUND`. #2578 (2.2.3)
* Moved headers that are not part of OIIO's supported public API, but that
  still must be installed to be transitively included, do a "detail"
  subdirectory. #2648 (2.2.4)
* Fix many Mingw compiler warnings. #2657 (2.1.19/2.2.5)
* Windows: Improve Strutil::get_rest_arguments() handling of long path
  syntax (`"\\?\"` style). #2661 (2.1.19/2.2.6)
* Fix compilation error with armv7 + x86. #2660 (2.2.6)

Notable documentation changes:
* Many enhancements in the ImageBuf chapter. #2460 (2.1.11/2.2.0)
* The `LICENSE-THIRD-PARTY.md` file has been reorganized to be clearer,
  grouping parts with identical licenses. #2469 (2.2.1) And renamed to
  "THIRD-PARTY.md" to avoid confusing GitHub's reporting of the project's
  license. (2.2.6)
* Many fixes to the new readthedocs documentation, especially fixes to
  section cross-references and links.
* Improved INSTALL instructions. (2.2.2/2.1.13)
* Fix a variety of breaks on ReadTheDocs. #2581
* Improve the way we discuss optional modifiers.
* Document the PNG output controls for compression level. #2642 (2.2.4)
* Lots of spell check / typo fixes in docs and comments. #2678 (2.2.6)
* INSTALL.md: remove misleading old Windows build instructions. #2679 (2.2.6)
* New file .git-blame-ignore-revs lists the hashes of commits that only
  performed bulk reformatting, so that they don't misattribute authorship
  or modification date. Everybody do this in your local repo:
  `git config blame.ignoreRevsFile .git-blame-ignore-revs`
  #2683 (2.2.6)


Release 2.1.19 (1 Sep 2020) -- compared to 2.1.18
-------------------------------------------------
* DPX: Add support for reading DPX files from IOProxy (such as from a memory
  buffer). #2659 #2665
* PNG: New output option "png:filter" allows control of the PNG filter
  options. #2650
* Python: Fix binding of ImageSpec.erase_attribute. #2654
* Python: Fix missing ImageInput.read_image(). #2677
* Windows: Improve Strutil::get_rest_arguments() handling of long path
  syntax (`"\\?\"` style). #2661
* MinGW: Fix a variety of compiler warnings on this platform. #2657
* Fix build on Elbrus 2000 architecture. #2671

Release 2.1.18 (1 Aug 2020) -- compared to 2.1.17
-------------------------------------------------
* Python `ImageBuf.write()` added a variety that takes an open ImageOutput.
  This is the key to writing multi-subimage files from Python. #2640
* `oiiotool --eraseattrib` fixed: was not applying to all subimages. #2632
* RAW: Improve thread safety when more than one thread might be opening
  different raw files at the same time. #2633
* unordered_map_concurrent fixed a missing size decrement upon erase(). #2624
* Fixes to support certain recent pybind11 changes. #2637
* Fixes to support OpenColorIO v2. #2636
* Fixes to support more recent fmtlib versions. #2639
* PNG: document the "png:compressionLevel" output hint. #2642
* In oiioversion.h, add a `OIIO_MAKE_VERSION` macro that constructs the
  integer code for a particular major/minor/patch release. #2641
* 2.1.18.1: Fix version number which for 2.1.18.0 unfortunately still
  said it was 2.1.17.

Release 2.1.17 (1 Jul 2020) -- compared to 2.1.16
-------------------------------------------------
* Build: Use the discovered python binary name, to address the Fedora
  restriction that you must use "python2" or "python3" by name. #2598
* Docs: ImageBufAlgo::nonzero_region had been inadvertently left out of the
  Python chapter.
* Improve RLA reader's ability to detect corrupt or non-RLA files, which
  fixes crashes you could get from trying to read non-image files. #2600
* Support for building against Qt 5.15. (Note: Qt support is only needed
  for the "iv" viewer.) #2605
* Fixes to support LibRaw 0.20 (which is currently in beta3). Note that this
  will make it incompatible with 0.20 beta1 and beta2, due to a fixed typo
  of a struct field in one of the LibRaw's headers. #2613
* oiioversion.h: fix typo that left the OIIO_VERSION_RELEASE_TYPE symbol
  undefined. #2616

Release 2.1.16 (1 Jun 2020) -- compared to 2.1.15
-------------------------------------------------
* OpenEXR: Fix bug in the channel sorting order when channels are "X" and
  "Y" (was reversing the order by confusing "Y" for "luminance"). #2595
* Python: Fixed a bug that lost certain string arguments, especially when
  passing a TypeDesc as its string equivalent. #2587
* fmath: Very minor fix to OIIO::clamp(), shouldn't affect normal use with
  floats at all, but fixed a subtle quasi-bug in OSL. #2594
* TypeDesc has additional helpers of constexpr values TypeFloat2,
  TypeVector2, TypeVector4, TypeVector2i, TypePointer. #2592
* Build: The exported CMake config files now set cmake variable
  `OpenImageIO_PLUGIN_SEARCH_PATH` #2584
* Docs: improvements and fixes to broken page rendering.

Release 2.1.15 (11 May 2020) -- compared to 2.1.14
--------------------------------------------------
* RAW input: set the "raw:flip" attribute if the underlying libraw did a
  reorientation. #2572
* Movie files: Fix possible infinite loop in the FFMpeg-based reader. #2576
* Fixes to allow building against the forthcoming LibRaw 0.20 release. #2484
* Documentation fixes. #2581

Release 2.1.14 (1 May 2020) -- compared to 2.1.13
-------------------------------------------------
* JPEG & PNG: Fix loss of 'config' hints upon close and reopen that could
  happen in cases where scanlines were accessed out of order. #2549
* TIFF: Fix subtle bug when reading certain Exif directories in the header.
  #2540
* Added OCIO role accessors to the ColorConfig class. #2548
* Improve error messages when overscan textures are not possible. #2521
* Build: fix problems when compiling against current libtiff master (symbol
  clash on GPSTAG values). #2539
* Build: Fix static boost to not overlink. #2537.
* Fix some problems with the docs. #2541
* `AttrDelegate::as_vec<>` returns the whole attribute as a std::vector.
  #2528
* Add a build_libtiff.bash script to make it easy to build the libtiff
  dependency. #2543

Release 2.1.13 (1 Apr 2020) -- compared to 2.1.12
-------------------------------------------------
* Fix: iinfo return code now properly indicates failures for files that
  can't be opened. #2511
* Fix: Catch previously uncaught exceptions that could happen in certain
  Filesystem utility calls. #2522
* Fi: Some `span<>` methods involving `std::vector` now will work properly
  with vectors that have custom allocators. #2533
* Fix: ParamValueList `add_or_replace()` was failing to "replace" if the new
  attribute had a different type than the existing one. #2527
* Fix: Fix resolution unit metadata that was not properly set in JPEG output.
  #2516
* Build: Additional cmake controls to customize required vs optional
  dependencies -- `REQUIRED_DEPS` (list of dependencies normally optional
  that should be treated as required) and `OPTIONAL_DEPS` (list of
  dependencies normally required that should be optional). The main use case
  is to force certain optional deps to be required for your studio, to be
  sure that missing deps are a full build break, and not a successful build
  that silently lacks features you need. #2507
* Build: Fix exported config file, it was not ensuring that the Imath
  headers properly ended up in the config include path. #2515
* Build: Ensure compatibility and clean builds with clang 10. #2518
* Build: All the `build_foo.bash` helper scripts now use `set -ex` to ensure
  that if any individual commands in the script fails, the whole thing will
  exit with a failure. #2520
* Build correctly against the current master branch of OpenColorIO
  (previously we were only testing and properly building against the 1.1
  release). #2530
* Added Strutil::upper() and lower() functions. #2525
* ParamValueList enhancement: new `find_pv()` method that is similar to
  `find()` but returns a pointer rather than an iterator and nullptr if the
  attribute is not found. #2527
* Add `get_indexed()` method to ParamValueList and AttrDelegate. #2526

Release 2.1.12 (2 Mar 2020) -- compared to 2.1.11
-------------------------------------------------
* Fix: plugin.h getsym() didn't pass along its report_error param. #2465
* Fix: ImageBuf::getchannel() did not honor its wrap parameter. #2465
* Fix: ImageSpec::erase_attribute() did not honor its `searchtype` param. #2465
* Fix: IBA::reorient() and IBA::computePixelsHashSHA1() did not honor their
  `nthreads` parameter. #2465.
* IBA::resample() now uses the clamp wrap mode to avoid black fringing and
  match the behavior of resize(). #2481
* Fix: ImageBuf::get_pixels() did not honor the stride parameters. #2487.
* fmath.h perf improvements: clamp() is 2x faster; madd() is improved
  especially on platforms without fma hardware; perf improvements in
  `fast_sin`, `fast_cos`; new `safe_fmod` is faster than std::fmod, new
  `fast_neg` is faster than simple negation in many cases, if you don't care
  that -(0.0) is 0.0 (rather than a true -0.0). #2491 #2492 #2494
* strutil: New function: concat(). #2478
* Build: un-embed the 'fmt' headers, instead auto-download if not found.
  #2439
* Build: Protect against certain compiler preprocessor errors for user
  programs that include strutil.h but also include `fmt` on its own. #2498.

Release 2.1.11 (1 Feb 2020) -- compared to 2.1.10
-------------------------------------------------
* Python bindings for `ParamValueList.attribute()`, when being passed
  attributes containing multiple values, now can have those values passed
  as Python lists and numpy arrays (previously they had to be tuples).
  #2437
* OpenEXR support is extended to handle float vector metadata. #2459
* Developer goody: simd.h vfloat3 has added a `normalize()`, `length()`,
  and `length2()` methods, to more closely match the syntax of Imath::Vec3f.
  #2437
* Internals: changed a lot of assertions to only happen in debug build mode,
  and changed a lot that happen in release builds to only print the error
  but not force a termination. #2435
* simd.h fix errors in vbool == and !=. #2463
* Make sure the embedded 'farmhash' implementation is completely hidden
  behind proper namespaces. #2473
* Many docs fixes.

Release 2.1.10.1 (10 Jan 2020)
------------------------------
* Automatically detect the need to link against libatomic (fixes build on
  some less common platforms, should not affect Windows, MacOS, or Linux on
  x86/x86_64 users). #2450 #2455
* Fixes to unordered_map_concurrent.h that affect some users who it for
  things other than OIIO per se (recent changes to the internals broke its
  use for the default underlying std::unordered_map). #2454
* Bump the minimum pybind11 version that we auto-download, and also be sure
  to auto-download if pybind11 is found on the system already but is not an
  adequately new version. #2453
* If libsquish is found on the system at build time, use it, rather than
  the "embedded" copy. This can improve build times of OIIO, and also helps
  us comply with Debian packaging rules that forbid using embedded versions
  of other Debian packages that can be used as simple dependencies. #2451
* Fixes to formatting of man page generation (resolves warnings on Debian
  build process).

Release 2.1.10 (1 Jan 2020) -- compared to 2.1.9
--------------------------------------------------
* Suppress warnings with old libraw on earlier gcc versions. #2413
* Exif read: guard better against out of range offests, fixes crashes when
  reading jpeg files with malformed exif blocks. #2429
* Python: add binding for missing ParamValue constructors. #2417
* oiiotool & ImageBuf better error messages (rather than mysterious crash)
  for certain out of memory conditions. #2414
* oiiotool --create and --pattern take a new optional parameter:
  `:type=name` that overrides the default behavior of allocating all
  internal buffers as float. #2414
* Lots of typo fixes in docs, comments, and error messages. #2438
* Fix broken version in the built openimageio.pc PkgConfig file. #2441
* Fix typo in build script that caused it to fail to set the right symbol
  definition when building static libs. #2442.
* More robust OIIO_PRETTY_FUNCTION definition. #2413
* Better fallback for OIIO_ALIGN, rely on C++11. #2412
* Docs: fix some II and IO chapter examples that used old open() API.
* Build: bump default version of pybind11 to 2.4.3. #2436
* Add ImageBuf::setpixel() methods that use cspan instead of ptr/len. #2443
* Fixes to cmake config generation. #2448


Release 2.1 (8 Dec 2019) -- compared to 2.0
----------------------------------------------
New minimum dependencies:
* CMake minimum is now 3.12. #2348 (2.1.5)

Major new features and performance improvements:
* Support for HEIC/HEIF images. HEIC is the still-image sibling of HEVC
  (a.k.a. H.265), and compresses to about half the size of JPEG but with
  higher visual quality. #2160 #2188 (2.1.0)
* oiiotool new commands: `-evaloff` `-evalon` `--metamerge` `--originoffset`
* ImageCache/TextureSystem improved perf of the tile and file caches under
  heavy thread contention. In the context of a renderer, we have seen
  improvements of around 7% in overall render time, averaged across a suite
  of typical production scenes.  #2314, #2316 (2.1.3) #2381 #2407 (2.1.8)
* Fix huge DPX reading performance regression. Technically this is a bug
  fix that restores performance we once had, but it's a huge speedup.
  #2333 (2.1.4)
* Reading individual frames from very-multi-image files (movie files) has
  been greatly sped up (10x or more). #2345 (2.1.4)

Public API changes:
* ImageSpec new methods `getattribute()` and `getattributetype()`. #2204
  (2.1.1)
* ImageSpec and ParamValueList now support operator `["name"]` as a way
  to set and retrieve attributes. For example,

      myimagespec["compression"] = "zip";
      myimagespec["PixelAspectRatio"] = 1.0f;
      int dither = myimagespec["oiio:dither"].get<int>();
      std::string cs = myimagespec["colorspace"];

  See the documentation about "Attribute Delegates" for more information,
  or the new header `attrdelegate.h`. #2204 (2.1.1) #2297 (2.1.3)
* ImageSpec::find_attribute now will retrieve "datawindow" and "displaywindow"
  (type int[4] for images int[6] for volumes) giving the OpenEXR-like bounds
  even though there is no such named metadata for OIIO (the results will
  assembled from x, y, width, height, etc.). #2110 (2.1.0/2.0.4)
* "Compression" names (where applicable) can now have the quality appended
  to the name (e.g., `"jpeg:85"`) instead of requiring quality to be passed
  as a separate piece of metadata. #2111 (2.1.0/2.0.5)
* Python: define `__version__` for the module. #2096 (2.1.0/2.0.4)
* Python error reporting for `ImageOutput` and `ImageBuf.set_pixels`
  involving transferring pixel arrays have changed from throwing exceptions
  to reporting errors through the usual OIIO error return codes and queries.
  #2127 (2.1.0/2.0.5)
* New shell environment variable `OPENIMAGEIO_OPTIONS` can now be used to
  set global `OIIO::attribute()` settings upon startup (comma separated
  name=value syntax). #2128 (2.1.0/2.0.5)
* ImageInput open-with-config new attribute `"missingcolor"` can supply
  a value for missing tiles or scanlines in a file in lieu of treating it
  as an error (for example, how OpenEXR allows missing tiles, or when reading
  an incompletely-written image file). A new global `OIIO::attribute()`
  setting (same name) also accomplishes the same thing for all files read.
  Note that this is only advisory, and not all file times are able to do
  this (OpenEXR is the main one of interest, so that works). #2129 (2.1.0/2.0.5)
* `ImageCache::invalidate()` and `TextureSystem::invalidate()` now take an
  optional `force` parameter (default: true) that if false, will only
  invalidate a file if it has been updated on disk since it was first opened.
  #2133, #2166 (2.1.0/2.0.5)
* New filter name `"nuke-lanczos6"` matches the "lanczos6" filter from Nuke.
  In reality, it's identical to our "lanczos3", but the name alias is
  supposed to make it more clear which one to use to match Nuke, which uses
  a different nomenclature (our "3" is radius, their "6" is full width).
  #2136 (2.1.0/2.0.5)
* New helper functions in `typedesc.h`: `tostring()` converts nearly any
  TypeDesc-described data to a readable string, `convert_type()` does data
  type conversions as instructed by TypeDesc's. #2204 (2.1.1)
* ImageBuf:
    - Construction from an ImageSpec now takes an optional `zero` parameter
      that directly controls whether the new ImageBuf should have its buffer
      zeroed out or left uninitialized. #2237 (2.1.2)
    - `set_write_format()` method has a new flavor that takes a
      `cspan<TypeDesc>` that can supply per-channel data types. #2239 (2.1.1)
* ColorConfig:
    - Added `getColorSpaceFamilyByName()`, `getColorSpaceNames()`,
      `getLookNames()`, `getDisplayNames()`, `getDefaultDisplayName()`,
      `getViewNames()`, `getDefaultViewName()`. #2248 (2.1.2)
    - Added Python bindings for ColorConfig. #2248 (2.1.2)
* Formal version numbers are now four parts: MAJOR.MINOR.PATCH.TWEAK.
  #2313,#2319 (2.1.3)
* ImageInput now sets "oiio:subimages" attribute to an int representing the
  number of subimages in a multi-image file -- if known from reading just
  the header. A positive value can be relied upon (including 1), but a
  value of 0 or no such metadata does not necessarily mean there are not
  multiple subimages, it just means it could not be known from inexpensively
  reading only the header. #2344 (2.1.4)
* The `imagesize_t` and `stride_t` values now have revised definitions.
  It should be fully API/ABI compatible (at least for 64 bit systems), but
  is a simpler, more modern, more platform-independent definition.
  #2351 (2.1.5)
* `DeepData` has been altered to make pixel indices and total counts int64_t
  rather than int, in order to be safe for very large images that have > 2
  Gpixels. #2363 (2.1.5)
* On OSX, we now expect non-embedded plugins to follow the convention of
  naming runtime-loaded modules `foo.imageio.so` (just like on Linux),
  whereas we previously used the convention of `foo.imageio.dylib`. Turns
  out that dylib is supposed to be only for shared libraries, not runtime
  loadable modules. #2376 (2.1.6)

Fixes and feature enhancements:
* oiiotool:
    - New `-evaloff` and `-evalon` lets you disable and enable the expression
      substitution for regions of arguments (for example, if you have an
      input image filename that contains `{}` brace characters that you want
      interpreted literally, not evaluated as an expression). #2100 (2.1.0/2.0.4)
    - `--dumpdata` has more intelligible output for uint8 images. #2124
       (2.1.0/2.0.4)
    - Fixed but that could prevent `-iconvert oiio:UnassociatedAlpha 1` from
      correctly propagating to the input reader. #2172 (2.1.0/2.0.6)
    - `-o:all=1` (which outputs all subimages to separate files) fixed a
      crash that would occur if any of the subimages were 0x0 (it could
      happen; now it just skips outputting those subimages). #2171 (2.1.0)
    - Improved support of files with multiple subimages: Several commands
      honored `-a` but did not respect individual `allsubimages=` modifiers
      (--ch, --sattrib, --attrib, --caption, --clear-keywords,
      --iscolorspace, --orientation, --clamp, -fixnan); Several commands
      always worked on all subimages, but now properly respect `-a` and
      `allsubimages=` (--origin, --fullpixels, --croptofull, --trim);
      Several commands were totally unaware of subimages, but now are so and
      respect `-a` and `allsubimages=` (--crop, --fullsize, --zover, --fill,
      --resize, --resample). #2202 #2219, #2242 (2.1.1, 2.1.2)
    - `--ociodisplay`: empty display or view names imply using the default
      display or view. #2273 (2.0.10/2.1.3)
    - `--metamerge` option causes binary image operations to try to "merge"
      the metadata of their inputs, rather than simply copy the metadata
      from the first input and ignore the others. #2311 (2.1.3)
    - `--colormap` now supports a new "turbo" color map option. #2320 (2.1.4)
    - Expression evaluation has been extended to support operators `//` for
      integer division (whereas `/` is floating point division), and `%`
      for integer modulus. #2362 (2.1.5)
    - New `--originoffset` resets the data window origin relative to its
      previous value (versus the existing `--origin` that sets it absolutely).
      #2369 (2.1.5)
    - `--paste` has two new optional modifiers: `:all=1` pastes the entire
      stack of images together (versus the default of just pasting the top
      two images on the stack), and `:mergeroi=1` causes the result to have
      the merged data window of all inputs, instead of the foreground image
      clipping against the boundary of the background image data. #2369 (2.1.5)
    - `--paste` now works with deep images. #2369 (2.1.5)
    - `--paste` semantics have changed: the meaning of pasting FG into BG at
      (x,y) now means that the (0,0) origin of FG ends up at (x,y), whereas
      before it placed the corner of FG's data window at (x,y). This will
      not change behavior for ordinary images where FG's data window is (0,0),
      but it makes behavior more sensible for "cropped" or "shrink-wrapped"
      FG images that have non-zero data window origin. #2369 (2.1.5)
    - `paste()` is now multithreaded and therefore much faster. #2369 (2.1.5)
    - `--ociotransform` no longer issues an error message when no valid OCIO
      configuration is found (because it's not needed for this operation).
      #2371 (2.1.5)
    - `--compare` would fail to notice differences in deep images where the
      corresponding pixels had differing numbers of samples. #2381 (2.1.8)
* ImageBuf/ImageBufAlgo:
    - `IBA::channel_append()` previously always forced its result to be float,
      if it wasn't previously initialized. Now it uses the usual type-merging
      logic, making the result the "widest" type of the inputs. #2095
      (2.1.0/2.0.4)
    - IBA `resize()`, `fit()`, and `resample()` are no longer restricted to
      source and destination images having the same number of channels.
      #2125 (2.1.0/2.0.5)
    - Improve numerical precision of the unpremult/premult part of certain
      color transformations. #2164 (2.1.0)
    - `ImageBuf::read()` now properly forwards the "progress" parameters
      to any underlying call to `read_image`. #2196 (2.1.1)
    - The `OIIO_DISPATCH_COMMON_TYPES2/3` macros used internally by many IBA
      functions have been expanded to handle a few more cases "natively"
      without conversion to/from float. This may make a few cases of odd
      data type combinations have higher precision. #2203 (2.0.8/2.1.1)
    - IBA `resize()` fix precision issues for 'double' images. #2211
      (2.0.8/2.1.1)
    - `IBA::ociodisplay()`: empty display or view names imply using the
      default display or view. #2273 (2.0.10/2.1.3)
    - `IBA::fixNonFinite()`: fixed impicit float/double casts to half. #2301
      (2.0.10/2.1.3)
    - `IBA::color_map()`:  now supports a new "turbo" color map option.
      #2320 (2.1.4)
    - `IBA::paste()` now works with deep images. #2369 (2.1.5)
    - `paste` semantics have changed: the meaning of pasting FG into BG at
      (x,y) now means that the (0,0) origin of FG ends up at (x,y), whereas
      before it placed the corner of FG's data window at (x,y). This will
      not change behavior for ordinary images where FG's data window is (0,0),
      but it makes behavior more sensible for "cropped" or "shrink-wrapped"
      FG images that have non-zero data window origin. #2369 (2.1.5)
    - `paste()` is now multithreaded and therefore much faster. #2369 (2.1.5)
    - `ociotransform()` no longer issues an error message when no valid OCIO
      configuration is found (because it's not needed for this operation).
      #2371 (2.1.5)
    - Python `ociotransform` and `ociolook` mixed up the names and orders of
      the `inverse` and `unpremult` params, making it so that you couldn't
      properly specify the inverse. #2371 (2.1.5)
    - `IBA::compare()` would fail to notice differences in deep images where
      the corresponding pixels had differing numbers of samples. #2381 (2.1.8)
* ImageInput read_image/scanline/tile fixed subtle bugs for certain
  combination of strides and channel subset reads. #2108 (2.1.0/2.0.4)
* ImageCache / TextureSystem / maketx:
    - More specific error message when tile reads appear to be due to the
      file having changed or been overwritten on disk since it was first
      opened. #2115 (2.1.0/2.0.4)
    - maketx: the `-u` (update mode) is slightly less conservative now,
      no longer forcing a rebuild of the texture just because the file uses
      a different relative directory path than last time. #2109 (2.1.0/2.0.4)
    - Protection against certain divide-by-zero errors when using
      very blurry latong environment map lookups. #2121 (2.1.0/2.0.5)
    - `maketx -u` is smarter about which textures to avoid re-making because
      they are repeats of earlier commands. #2140 (2.1.0/2.05)
    - Fix possible maketx crash on Windows due to a stack overflow within
      MSVS's implementation of std::regex_replace! #2173 (2.1.0/2.0.6)
    - TS: New attribute "max_mip_res" limits filtered texture access to MIP
      levels that are no higher than this resolution in any dimension. The
      default is 1<<30, meaning no effective limit. #2174 (2.1.1)
    - Stats now count the number of `TS::get_texture_info/IC::get_image_info`
      calls, like it did before for texture, etc. #2223 (2.1.1)
    - `TS::environment()` can resolve subimage by name, as we do for
      texture() and texture3d(). #2263
    - Improvements to error message propagation. (2.1.3)
    - Avoid creating a new thread info struct while resolving udims. #2318
      (2.1.4)
    - Work around bug in OpenEXR, where dwaa/dwab compression can crash when
      used on 1-channel tiled images with a tile size < 16. This can crop up
      for MIP-maps (high levels where rez < 16), so we detect this case and
      switch automatically to "zip" compression. #2378 (2.1.6)
    - When converting images to texture (via maketx or IBA::make_texture),
      correctly handle color space conversions for greyscale images.
      #2400 (2.1.8)
* iv viewer:
    - Image info window now sorts the metadata, in the same manner as
      `iinfo -v` or `oiiotool -info -v`. #2159 (2.1.0/2.0.5)
* All command line utilities, when run with just `--help`, will exit with
  return code 0. In other words, `utility --help` is not an error.
  #2364 (2.1.5) #2383 (2.1.8)
* Python bindings:
    - Fix inability for Python to set timecode attributes (specifically, it
      was trouble setting ImageSpec attributes that were unsigned int
      arrays). #2279 (2.0.9/2.1.3)
* Improved performance for ustring creation and lookup. #2315 (2.1.3)
* BMP:
    - Fix bugs related to files with very high resolution (mostly 32 bit
      int overflow issues and care to use 64 bit fseeks). Also speed up
      reading and writing very large files. #2404 (2.1.8)
* DPX:
    - Now recognizes the new transfer/colorimetric code for ADX. #2119
      (2.1.0/2.0.4)
    - Fix potential crash when file open fails. #2186 (2.0.7/2.1.1)
    - Support for reading and writing 1-channel (luma, etc.) images. #2294
      (2.0.10/2.1.3)
    - Fix huge DPX reading performance regression. #2333 (2.1.4)
    - Fix bugs related to int32 math that would lead to incorrect
      behavior in very high-resolution files. #2396 (2.1.3)
* ffmpeg/Movie files:
    - Reading individual frames from very-multi-image files (movie files) has
      been greatly sped up (10x or more). #2345 (2.1.4)
    - Support for reading movie files that (a) contain alpha channels, and
      (b) have bit depths > 8 bits per channel. Previously, such files
      would be read, but would be presented to the app as a 3-channel
      8 bit/channel RGB. #2349 (2.1.5)
* FITS:
    - Fix 16 and 32 bit int pixels which FITS spec says are signed, but we
      were treating as unsigned. #2178 (2.1.0)
* HDR/RGBE:
    - Fix bugs related to files with very high resolution (mostly 32 bit
      int overflow issues and care to use 64 bit fseek). Also speed up
      reading and writing very large files. #2406 (2.1.8)
* IFF
    - Detect and error requests to open files for writing with resolutions
      too high to be properly supported by IFF files. #2397 (2.1.8)
    - Improve error messages when a file can't be opened. #2398 (2.1.8)
* JPEG:
    - Read-from-memory is now supported via IOProxy use. #2180. (2.1.1)
* JPEG-2000:
    - Disable JPEG-2000 support for the (rare) combination of an older
      OpenJPEG 1.x and EMBEDPLUGINS=0 mode, which was buggy. The solution if
      you really need EMBEDPLUGINS and JPEG-2000 support is to please use
      OpenJPEG >= 2.0. #2183. (2.0.7/2.1.1)
* OpenEXR:
    - Avoid some OpenEXR/libIlmImf internal errors with DWA compression by
      switching to zip for single channel images with certain small tile
      sizes. #2147 (2.1.0/2.0.5)
    - Suppress empty string subimage name (fixes a problem with certain
      V-Ray written multi-part exr images). #2190 (2.1.1/2.0.7)
    - Fixed bug that broke th ability to specify compression of multipart
      OpenEXR files. #2252 (2.1.2)
* PNG:
    - More careful catching and reporting errors and corrupt PNG files.
      #2167 (2.1.0/2.0.6)
    - IOProxy reading is now supported. #2180. (2.1.1)
* PSD:
    - When reading PSD files with multiple PhotoShop "layers", properly set
      ImageSpec x, y to the image plane offset (upper left corner) of the
      layer, and set and metadata "oiio:subimagename" to the layer name.
      #2170 (2.1.0)
* RAW:
    - Clarification about color spaces: The open-with-config hint
      "raw:ColorSpace" is more careful about color primaries versus transfer
      curve. Asking for "sRGB" (which is the default) gives you true sRGB --
      both color primaries and transfer. Asking for "linear" gives you
      linear transfer with sRGB/Rec709 primaries. The default is true sRGB,
      because it will behave just like JPEG. #2260 (2.1.2)
    - Added "raw:half_size" and "raw:user_mul" configuration attributes.
      #2307 (2.1.3)
* RLA:
    - Improved logic for determining the single best data type to report
      for all channels. #2282 (2.1.3)
* SGI:
    - Fix bugs when writing extremely high resolution images, due to
      internal 32 bit arithmetic on file offsets. #2402 (2.1.8)
    - Speed up reading and writing of SGI files. #2402 (2.1.8)
* Targa:
    - Put in checks to detect and error requests to write Targa with
      resolutions too high to be supported by the format. #2405 (2.1.8)
* TIFF:
    - Fix problems with JPEG compression in some cases. #2117 (2.1.0/2.0.4)
    - Fix error where reading just a subset of channels, if that subset did
      not include the alpha channel but the image was "unassociated alpha",
      the attempt to automatically associate (i.e. "premultiply" the alpha)
      upon read would get bogus values because the alpha channel was not
      actually read. Now in this case it will not do the premultiplication.
      So if you are purposely reading RGB only from an RGBA file that is
      specifically "unassociated alpha", beware that you will not get the
      automatic premultiplication. #2122 (2.1.0/2.0.4)
    - More careful check and error reporting when user tries to request
      writing to a TIFF file mixed channel data types (which is not supported
      by the underlying libtiff). #2112 (2.1.0/2.0.5)
    - Fix crash reading certain old nconvert-written TIFF files.
      #2207 (2.0.8/2.1.1)
    - Fix bugs when reading TIFF "cmyk" files. #2292. (2.0.10/2.1.3)
    - Correctly handle read and write of 6, 14, and 24 bit per sample
      images. #2296 (2.1.3)
    - Fix potential deadlock in TIFF I/O: minor flaw with threadpool method
      #2327 (2.1.4)
* WebP:
    - Fix bug that gave totally incorrect image read for webp images that
      had a smaller width than height. #2120 (2.1.0/2.0.4)
* zfile:
    - Put in checks to detect and error requests to write zfiles with
      resolutions too high to be supported by the format. #2403 (2.1.8)
* Fix potential threadpool deadlock issue that could happen if you were
  (among possibly other things?) simultaneously calling make_texture from
  multiple application threads. #2132 (2.1.0/2.0.4)
* ImageInput/ImageOutput `create()` now properly lets you specify the type
  for reader/writer from the format name itself (versus just the extension,
  for example "openexr" versus "exr"). #2185 (2.1.1)
* Make all the various "could not open" messages across the writers use the
  same phrasing. #2189 (2.1.1)
* Better care in some image readers/writers to avoid errors stemming from
  integer overflow when compting the size of large images. #2232 (2.1.2)

Build/test system improvements and platform ports:
* Major overhaul of the CMake build system now that our CMake minimum is
  3.12. #2348 #2352 #2357 #2360 #2368 #2370 #2372 #2373 (2.1.5) #2392 (2.1.8)
  Highlights:
    - All optional dependencies (e.g. "Pkg") now can be disabled (even if
      found) with cmake -DUSE_PKG=0 or environment variable USE_PKG=0.
      Previously, some packages supported this, others did not.
    - All dependencies can be given find hints via -DPkg_ROOT=path or by
      setting environment variable Pkg_ROOT=path. Previously, some did, some
      didn't, and the ones that did had totally inconsistent names for the
      path hint variable (PKG_HOME, PKG_ROOT_DIR, PKG_PATH, etc).
    - Nice color coded status messages making it much more clear which
      dependencies were found, which were not, which were disabled.
    - Use standard BUILD_SHARED_LIBS to control shared vs static libraries,
      replacing the old nonstandard BUILDSTATIC name.
    - Use correct PUBLIC/PRIVATE marks with target_link_libraries and
      target_include_directories, and rely on cmake properly understanding
      the transitive dependencies.
    - CMAKE_DEBUG_POSTFIX adds an optional suffix to debug libraries.
    - CMAKE_CXX_STANDARD to control C++ standard (instead of our nonstandard
      USE_CPP).
    - CXX_VISIBILITY_PRESET controls symbol visibility defaults now, not
      our nonstandard HIDE_SYMBOLS. And the default is to keep everything
      hidden that is not part of the public API.
    - At config time, `ENABLE_<name>=0` (either as a CMake variable or an
      env variable) can be used to disable any individual file format or
      command line utility. E.g., `cmake -DENABLE_PNG=0 -DENABLE_oiiotool=0`
      This makes it easier to greatly reduce build time if you are 100%
      sure there are formats or components you don't want or need.
    - Config based install and usage.
* Deprecate "missingmath.h". What little of it is still needed (it mostly
  addressed shortcomings of old MSVS releases) is now in fmath.h. #2086
* Remove "osdep.h" header that was no longer needed. #2097
* Appveyor scripts have been overhauled and simplified by relying on
  `vcpkg` to build dependencies. #2113 (2.1.0/2.0.4)
* Detect and error if builder is trying to use a pybind11 that's too old.
  #2144 (2.1.0/2.0.5)
* New CMake build-time option `OIIO_LIBNAME_SUFFIX` (default: empty) lets
  you append an optional name to the libraries produced (to disambiguate
  two builds at the same facility or distro, much like you could do before
  for symbols with custom namespaces). #2148 (2.1.0)
* On MacOS 10.14 Mojave, fix warnings during `iv` compiler about OpenGL
  being deprecated in future releases. #2151 (2.1.0/2.0.5)
* At build time, the Python version used can be controlled by setting the
  environment variable `$OIIO_PYTHON_VERSION`, which if set will initialize
  the default value of the CMake variable `PYTHON_VERSION`. #2161 (2.0.5/2.1.0)
* On non-Windows systems, the build now generates a PkgConfig file, installed
  at `CMAKE_INSTALL_PREFIX/lib/pkgconfig/OpenImageIO.pc`. #2158 (2.0.5/2.1.0)
* A new unit test has been backported from master, which tries to perform a
  series of read/write tests on every file format. In particular, this tests
  certain error conditions, like files not existing, or the directory not
  being writable, etc. #2181, #2189 (2.0.8/2.1.1)
* Support for CI tests on CircleCI. #2194 (2.1.1) Retired in #2389 (2.1.8).
* New build-time flag `USE_WEBP=0` can be used to disable building WebP
  format support even on platforms where webp libraries are found.
  #2200 (2.1.1)
* Fix compiler warnings on Windows. #2209 #2213 #2214 #2392
* Crashes in the command line utilities now attempt to print a stack trace
  to aid in debugging (but only if OIIO is built with Boost >= 1.65, because
  it relies on the Boost stacktrace library). #2229 (2.0.8/2.1.1)
* Add gcc9 to Travis tet matrix and fix gcc9 related warnings. #2235 (2.1.2)
* VDB reader pulled in the TBB libraries using the wrong CMake variable.
  #2274 (2.1.3)
* The embedded `fmt` implementation has been updated to fix windows
  warnings. #2280 (2.1.3)
* Improvements for finding certain new Boost versions. #2293 (2.0.10/2.1.3)
* Build fixes for MinGW. #2304, #2308 (2.0.10/2.1.3)
* libraw: Fixes to make it build properly against some changes in the
  libraw development master. #2306 (2.1.3)
* Use GitHub Actions CI. Eliminate Appveyor and some Travis tests.
  #2334 (2.1.4) #2356 (2.1.5) #2395 (2.1.8)
* Updated and improved finding of OpenEXR and `build_openexr.bash` script
  that we use for CI. #2343 (2.1.4)
* Upgrade the pybind11 version that we auto-install when not found (to 2.4.2),
  and add logic to detect the presence of some pybind11 versions that are
  known to be (buggily) incompatible with C++11. #2347 (2.1.5)
* Fix errors in very new MSVS versions where it identified a suspicious
  practice of ImageBuf's use of a unique_ptr of an undefined type. Jump
  through some hoops to make that legal. #2350 (2.1.5)
* All Python scripts in the tests have been modified as needed to make them
  correct for both Python 2.7 and 3.x. #2355, #2358 (2.1.5)
* Tests are now safe to run in parallel and in unspecified order. Running
  with env variable CTEST_PARALLEL_LEVEL=[something more than 1] greatly
  speeds up the full testsuite on multi-core machines. #2365 (2.1.5)
* Bump robin map version to latest release (v0.6.2) #2401 (2.1.8)
* Fix compiler warnings in ustring.h when `_LIBCPP_VERSION` is not defined.
  #2415 (2.1.8.1)
* Bump fmt library to v6.1.0. #2423 (2.1.8.1)

Developer goodies / internals:
* argparse.h:
    - Add unit tests. #2192 (2.1.1)
    - Add "%1" which is like "%*" but its list receives only arguments that
      come *before* any other dash-led arguments. #2192 (2.1.1)
    - Allow specifiers such as "%d:WIDTH" the part before the colon is the
      type specifier, the part after the colon is the name of the parameter
      for documentation purposes. #2312 (2.1.3)
* attrdelegate.h:
    - New header implements "attribute delegates." (Read header for details)
      #2204 (2.1.1)
* dassert.h:
    - Spruce up assertion macros: more uniform wording, and use pretty
      function printing to show what function the failure was in. #2262
    - The new preferred assertion macros are `OIIO_ASSERT` and `OIIO_DASSERT`.
      The `OIIO_ASSERT` always tests and prints an error message if the test
      fails, but now only aborts when compiled without NDEBUG defined (i.e.
      no abort for release builds), whereas `OIIO_DASSERT` is for debug mode
      only and does nothing at all (not even perform the test) in release
      mode. These names and behaviors are preferred over the old `ASSERT`
      and `DASSERT`, though those deprecated names will continue for at least
      another major release. #2411 (2.1.8.1)
* filesystem.h:
    - Change many filesystem calls to take string_view arguments. #2388 (2.1.8)
    - New `fseek()` and `ftell()` that always use 64 bit offsets to be safe
      for very large files. #2399 (2.1.8)
* fmath.h:
    - `safe_mod()` does integer modulus but protects against mod-by-zero
      exceptions. #2121 (2.1.0/2.0.5)
    - pow2roundup/pow2rounddown have been renamed ceil2/floor2 to reflect
      future C++20 standard. The old names still work, so it's a fully back
      compatible change. #2199 (2.0.8/2.1.1)
    - To match C++20 notation, use `rotl()` template innstead of separate
      rotl32/rotl64 functions. #2299, #2309 (2.1.3)
* platform.h:
    - New `OIIO_RETURNS_NONNULL` macro implements an attribute that marks
      a function that returns a pointer as guaranteeing that it's never
      NULL. #2150 (2.1.0/2.0.5)
* SHA1.h:
    - Upgraded this embedded code from version 1.8 (2008) to the newest
      release, 2.1 (2012). This fixes some Windows warnings. #2342 (2.1.4)
* simd.h:
    - Added vec4 * matrix44 multiplication. #2165 (2.1.0/2.0.6)
    - Guard against shenanigans when Xlib.h having been included and
     `#define`ing True and False. #2272 (2.0.9/2.1.3)
* strutil.h:
    - Added `excise_string_after_head()`. #2173 (2.1.0/2.0.6)
    - Fixed incorrect return type of `stof()`. #2254 (2.1.2)
    - Added `remove_trailing_whitespace()` and `trim_whitespace()`. #2298
      (2.1.3)
    - `Strutil::wordwrap()` now lets you specify the separation characters
      more flexibly (rather than being hard-coded to spaces as separators).
      #2116 (2.1.0/2.0.4)
    - `Strutil::parse_while()`.  #2139 (2.1.0/2.0.5)
    - Added a variety of `join()` that allows you to set the number of items
      joined, truncating or padding with default values as needed. #2408
      (2.1.8)
    - Fix `join` to produce a joined string of float-like values with
      locale-independent formatting. #2408 (2.1.8)
    - Fix `vsnprintf` to be locale independent. #2410 (2.1.8)
    - New `lstrip()` and `rstrip()` are just like the existing `strip()`,
      but operate only on the beginning/left side or ending/right side of
      the string, respectively. #2409 (2.1.8)
* string_view.h:
    - `string_view` now adds an optional `pos` parameter to the `find_first_of`
      / `find_last_of` family of methods. #2114 (2.1.0/2.0.4)
* sysutil.h:
    - Added `stacktrace()` and `setup_crash_stacktrace()`. (Only functional
      if OIIO is built with Boost >= 1.65, because it relies on the Boost
      stacktrace library). #2229 (2.0.8/2.1.1)
* unittest.h:
    - Add `OIIO_CHECK_IMAGEBUF_STATUS()` test macro. #2394 (2.1.8)
* unordered_map_concurrent.h:
    - Performance improvement by avoiding redundant hashing of keys, and
      improving the speed and properties of the hash function. #2313, #2316
      (2.1.3)
* ustring.h:
    - Bug fix in `ustring::compare(string_view)`, in cases where the
      string_view was longer than the ustring, but had the same character
      sequence up to the length of the ustring. #2283 (2.0.10/2.1.3)
* Wide use of declaring methods `noexcept` when we want to promise that
  they won't throw exceptions. #2156, #2243 (2.1.0, 2.1.2)
* Changed all (we think) internal string formatting that expects printf
  formatting notation to use the errorf/sprintf style calls, in anticipation
  of the error/format (no trailing -f) calls to eventually follow the
  std::format/python formatting notation. #2393 (2.1.8)

Notable documentation changes:
* The whole documentation system has been overhauled. The main docs have
  been converted from LaTeX to Sphinx (using Doxygen and Breathe) for
  beautiful HTML as well as PDF docs and automatic hosting on
  https://openimageio.readthedocs.io  #2247,2250,2253,2255,2268,2265,2270
* Copyright notices have been changed for clarity and conformance with
  SPDX conventions. #2264
* New GitHub issue templates, making separate issue types for bug reports,
  feature requests, build problems, and questions. #2271,#2346



Release 2.0.13 (1 Dec 2019) -- compared to 2.0.12
--------------------------------------------------
* Bug fix in deep image compare (`IBA::compare()` or `oiiotool --compare`)
  would fail to notice differences in deep images where the corresponding
  pixels had differing numbers of samples. #2381 (2.1.8/2.0.13)
* DPX: Fix bugs related to int32 math that would lead to incorrect behavior
  in very high-resolution files. #2396 (2.1.3/2.0.13)
* When converting images to texture (via maketx or IBA::make_texture),
  correctly handle color space conversions for greyscale images. #2400
  (2.1.8/2.0.13)
* Build: suppress warnings with libraw for certain gcc versions.
* Build: Fix compiler warnings in ustring.h when `_LIBCPP_VERSION` is not
  defined. #2415 (2.1.8.1/2.0.13)
* filesystem.h: New `fseek()` and `ftell()` that always use 64 bit offsets
  to be safe for very large files. #2399 (2.1.8/2.0.13)
* `Strutil::parse_string()` - fix bugs that would fail for escaped quotes
  within the string. #2386 (2.1.8/2.0.13)
* `Strutil::join()` added a variety that allows you to set the number of
  items joined, truncating or padding with default values as needed. #2408
  (2.1.8/2.0.13)
* New `Strutil::lstrip()` and `rstrip()` are just like the existing `strip()`,
  but operate only on the beginning/left side or ending/right side of
  the string, respectively. #2409 (2.1.8/2.0.13)

Release 2.0.12 (1 Nov, 2019) -- compared to 2.0.11
--------------------------------------------------
* Fix compiler warnings on some platform. #2375
* Work around bug in OpenEXR, where dwaa/dwab compression can crash when
  used on 1-channel tiled images with a tile size < 16. This can crop up for
  MIP-maps (high levels where rez < 16), so we detect this case and switch
  automatically to "zip" compression. #2378

Release 2.0.11 (1 Oct, 2019) -- compared to 2.0.10
-------------------------------------------------
* Fixes to build against LibRaw master. #2306
* Fix DPX reading performance regression. #2333
* Guard against buggy pybind11 versions. #2347
* Fixes for safe Cuda compilation of `invert<>` in fmath.h. #2197

Release 2.0.10 (1 Aug, 2019) -- compared to 2.0.9
-------------------------------------------------
* ColorConfig improvements: (a) new getColorSpaceFamilyByName(); (b) new
  methods to return the list of all color spaces, looks, displays, or views
  for a display; (c) all of ColorConfig now exposed to Python. #2248
* `IBA::ociodisplay()` and `oiiotool --ociodisplay`: empty display or view
  names imply using the default display or view. #2273
* Bug fix in `ustring::compare(string_view)`, in cases where the string_view
  was longer than the ustring, but had the same character sequence up to
  the length of the ustring. #2283
* `oiiotool --stats`: Fixed bug where `-iconfig` hints were not being
  applied to the file as it was opened to compute the stats. #2288
* Bug fix: `IBA::computePixelStats()` was not properly controlling the
  number of threads with the `nthreads` parameter. #2289
* Bug fix when reading TIFF bugs: In cases where the reader needed to close
  and re-open the file silently (it could happen for certain scanline
  traversal patterns), the re-open was not properly honorig any previous
  "rawcolor" hints from the original open. #2285
* Nuke txWriter updates that expose additional make_texture controls. #2290
* Build system: Improvements for finding certain new Boost versions. #2293
* Build system: Improvements finding OpenEXR installation.
* Fix bugs when reading TIFF "cmyk" files. #2292.
* DPX: support for reading and writing 1-channel (luma, etc.) DPX images.
  #2294
* `IBA::fixNonFinite()`: fixed impicit float/double casts to half. #2301
* Build fixes for MinGW. #2304

Release 2.0.9 (4 Jul, 2019) -- compared to 2.0.8
------------------------------------------------
* RAW: Clarification about color spaces: The open-with-config hint
  "raw:ColorSpace" is more careful about color primaries versus transfer
  curve. Asking for "sRGB" (which is the default) gives you true sRGB --
  both color primaries and transfer. Asking for "linear" gives you linear
  transfer with sRGB/Rec709 primaries. The default is true sRGB, because it
  will behave just like JPEG. #2260 (2.1.2)
* Improved oiiotool support of files with multiple subimages: Several
  commands honored `-a` but did not respect individual `allsubimages=`
  modifiers (--ch, --sattrib, --attrib, --caption, --clear-keywords,
  --iscolorspace, --orientation, --clamp, -fixnan); Several commands always
  worked on all subimages, but now properly respect `-a` and `allsubimages=`
  (--origin, --fullpixels, --croptofull, --trim); Several commands were
  totally unaware of subimages, but now are so and respect `-a` and
  `allsubimages=` (--crop, --fullsize, --zover, --fill, --resize,
  --resample). #2202 #2219, #2242
* Fix broken ability to specify compression of multipart exr files. #2252
* Fix Strutil::stof() return type error and other windows warnings. #2254
* IBA::colortmatrixtransform() and `oiiotool --ccmatrix` allow you to
  perform a matrix-based color space transformation. #2168
* Guard simd.h against shenanigans when Xlib.h having been included and
  `#define`ing True and False. #2272
* RAW: Clarification about color spaces: The open-with-config hint
  "raw:ColorSpace" is more careful about color primaries versus transfer
  curve. Asking for "sRGB" (which is the default) gives you true sRGB --
  both color primaries and transfer. Asking for "linear" gives you linear
  transfer with sRGB/Rec709 primaries. The default is true sRGB, because it
  will behave just like JPEG. #2260
* Fix inability for python to set timecode attributes (specifically, it was
  trouble setting ImageSpec attributes that were unnsigned int arrays).
  #2279

Release 2.0.8 (3 May, 2019) -- compared to 2.0.7
------------------------------------------------
* Fix Windows broken read of JPEG & PNG in some circumstances. #2231
* Some minor fixes to JPEG & PNG reading and file error robustness. #2187
* Fix crash reading certain old nconvert-written TIFF files. #2207
* Internals: The `OIIO_DISPATCH_COMMON_TYPES2/3` macros used by many
  ImageBufAlgo functions have been expanded to handle a few more cases
  "natively" without conversion to/from float. This may make a few cases
  of odd data type combinations have higher precision. #2203
* ImageBufAlgo::resize() fixes precision issues for 'double' images. #2211
* Testing: A new unit test has been backported from master, which tries to
  perform a series of read/write tests on every file format. In partcular,
  this tests certain error conditions, like files not existing, or the
  directory not being writable, etc. #2181
* Crashes in the command line utilities now attempt to print a stack trace
  to aid in debugging (but only if OIIO is built with Boost >= 1.65, because
  it relies on the Boost stacktrace library). #2229
* Dev goodies: fmath.h's powwroundup/pow2rounddown have been renamed
  ceil2/floor2 to reflect future C++ standard. The old names still work, so
  it's a fully back compatible change. #2199

Release 2.0.7 (1 Apr, 2019) -- compared to 2.0.6
------------------------------------------------
* DPX: fix potential crash when file open fails. #2186
* EXR: Suppress empty string for subimage name (fixes a problem when reading
  files written by V-Ray). #2190
* Disable JPEG-2000 support for the (rare) combination of an older OpenJPEG
  1.x and EMBEDPLUGINS=0 mode, which was buggy. The solution if you really
  need EMBEDPLUGINS and JPEG-2000 support is to please use OpenJPEG >= 2.0.
  #2183.
* New build flag `USE_WEBP=0` can be set to 0 to force disabled support of
  WebP even when the webp package is found. #2200
* Bug fix: `ImageInput::create(name)` and `ImageOutput::create(name)` worked
  if `name` was a filename (such as `foo.exr`), or the extension (such as
  `exr`), but previously did not work if it was the name of the format
  (such as `openexr`), despite having been documented as working in that
  case. #2185

Release 2.0.6 (1 Mar, 2019) -- compared to 2.0.5
------------------------------------------------
* PNG: more careful catching of errors and corrupt png files. #2167
* PSD: read now properly extracts layer/subimage name and data window offset
  coordinates. #2170
* ImageBuf: Fix bug in propagating unassociated alpha behavior request. #2172
* `oiiotool -o:all=1` fix crash when outputting 0x0 subimages. #2171
* Developer goodies: simd.h ops for vec4 * mat44 multiplication. #2165
* Developer goodies: `Strutil::excise_string_after_head()` #2173
* Fix crashes on Windows from certain regex replacement happening as part
  of MakeTexture (internally avoid MSVS implementation of std::regex). #2173

Release 2.0.5 (1 Feb, 2019) -- compared to 2.0.4
------------------------------------------------
* `resize()`, `fit()`, and `resample()` are no longer restricted to
  source and destination images having the same numer of channels. #2125
* Python error reporting for `ImageOutput` and `ImageBuf.set_pixels` involving
  transferring pixel arrays have changed from throwing exceptions to reporting
  errors through the usual OIIO error return codes and queries. #2127
* Protection against certain divide-by-zero errors when using very blurry
  latlong environment map lookups. #2121
* New shell environment variable `OPENIMAGEIO_OPTIONS` can now be used to
  set global `OIIO::attribute()` settings upon startup (comma separated
  name=value syntax). #2128
* ImageInput open-with-config new attribute `"missingcolor"` can supply
  a value for missing tiles or scanlines in a file in lieu of treating it
  as an error (for example, how OpenEXR allows missing tiles, or when reading
  an incompletely-written image file). A new global `OIIO::attribute()`
  setting (same name) also accomplishes the same thing for all files read.
  Note that this is only advisory, and not all file times are able to do
  this (OpenEXR is the main one of interest, so that works). #2129
* New filter name `"nuke-lanczos6"` matches the "lanczos6" filter from Nuke.
  In reality, it's identical to our "lanczos3", but the name alias is
  supposed to make it more clear which one to use to match Nuke, which uses
  a different nomenclature (our "3" is radius, their "6" is full width).
  #2136
* `maketx -u` is smarter about which textures to avoid re-making because
   they are repeats of earlier commands. #2140
* Detect/error if builder is trying to use a pybind11 that's too old. #2144
* OpenEXR: avoid some OpenEXR/libIlmImf internal errors with DWA compression
  by switching to zip for single channel images with certain small tile
  sizes. #2147
* On MacOS 10.14 Mojave, fix warnings during `iv` compile about OpenGL
  being deprecated in future releases. #2151
* `iv` info window now sorts the metadata. #2159
* At build time, the Python version used can be controlled by setting the
  environment variable `$OIIO_PYTHON_VERSION`, which if set will initialize
  the default value of the CMake variable `PYTHON_VERSION`. #2161 (2.0.5)
* On non-Windows systems, the build now generates a PkgConfig file, installed
  at `CMAKE_INSTALL_PREFIX/lib/pkgconfig/OpenImageIO.pc`. #2158 (2.0.5)

Release 2.0.4 (Jan 5, 2019) -- compared to 2.0.3
------------------------------------------------
* Fix potential threadpool deadlock issue that could happen if you were
  (among possibly other things?) simultaneously calling make_texture from
  multiple application threads. #2132
* ImageInput read_image/scanline/tile fixed subtle bugs for certain
  combination of strides and channel subset reads. #2108
* TIFF: Fix problems with JPEG compression in some cases. #2117
* TIFF: Fixed error where reading just a subset of channels, if that subset
  did not include the alpha channel but the image was "unassociated alpha",
  the attempt to automatically associate (i.e. "premultiply" the alpha) upon
  read would get bogus values because the alpha channel was not actually
  read. Now in this case it will not do the premultiplication. So if you are
  purposely reading RGB only from an RGBA file that is specifically
  "unassociated alpha", beware that you will not get the automatic
  premultiplication. #2122
* Python: define `__version__` for the module. #2096
* IBA::channel_append() previously always forced its result to be float, if
  it wasn't previously initialized. Now it uses the uaual type-merging
  logic, making the result the "widest" type of the inputs. #2095
* ImageSpec::find_attribute now will retrieve "datawindow" and "displaywindow"
  (type int[4] for images int[6] for volumes) giving the OpenEXR-like bounds
  even though there is no such named metadata for OIIO (the results will
  assembled from x, y, width, height, etc.). #2110
* ImageCache/TextureSystem: more specific error message when tile reads
  appear to be due to the file having changed or been overwritten on disk
  since it was first opened. #2115
* oiiotool: New `-evaloff` and `-evalon` lets you disable and enable
  the expression substitution for regions of arguments (for example, if
  you have an input image filename that contains `{}` brace characters that
  you want interpreted literally, not evaluated as an expression). #2100
* oiiotool `--dumpdata` has more intelligible output for uint8 images. #2124
* maketx: the `-u` (update mode) is slightly less conservative now,
  no longer forcing a rebuild of the texture just because the file uses
  a different relative directory path than last time. #2109
* WebP: fix bug that gave totally incorrect image read for webp images that
  had a smaller width than height. #2120
* Developer goodies: string_view now adds an optional `pos` parameter to the
  `find_first_of`/`find_last_of` family of methods. #2114
* Dev goodies: Strutil::wordwrap() now lets you specify the separation
  characters more flexibly (rather than being hard-coded to spaces as
  separators). #2116



Release 2.0 (Dec 1, 2018) -- compared to 1.8.x
----------------------------------------------

New minimum dependencies:
* On Windows compiling with MSVS, the new minimum version is MSVS 2015.

Major new features and improvements:
* ImageInput and ImageOutput static create() and open() methods now return
  `unique_ptr` rather than raw pointers. #1934, #1945 (1.9.3).
* ImageInput improvements to thread safety and concurrency, including some
  new API calls (see "Public API changes" section below).
* ImageBufAlgo overhaul (both C++ and Python): Add IBA functions that
  return image results directly rather than passing ImageBuf references
  as parameters for output (the old kind of calls still exist, too, and
  have their uses). Also in C++, change all IBA functions that took raw
  pointers to per-channel colors into `span<>` for safety. #1961 (1.9.4)
* For some readers and writers, an "IOProxy" can be passed that customizes
  the I/O methods. An important use of this is to write an image "file"
  to memory or to read an image "file" from a memory, rather than disk.
  Currently, OpenEXR supports this for both reading and writing, and PNG
  supports it for writing. You specify a pointer to the proxy via the
  configuration option "oiio:ioproxy". #1931 (1.9.3)
* New Image Format support:
    * OpenVDB file read (as volume images or accessing via texture3d()).
      #2010,2018 (1.9.4)
    * "null" images -- null reader just returns black (or constant colored)
      pixels, null writer just returns. This can be used for benchmarking
      (to eliminate all actual file I/O time), "dry run" where you want to
      test without creating output files. #1778 (1.9.0), #2042 (1.9.4)
* TIFF I/O of multiple scanlines or tiles at once (or whole images, as is
  typical use case for oiiotool and maketx) is sped up by a large factor
  on modern multicore systems. We've seen 10x or more faster oiiotool
  performance for uint8 and uint16 TIFF files using "zip" (deflate)
  compression, on modern 12-16 core machines. #1853 (1.9.2)
* Major refactor of Exif metadata handling, including much more complete
  metadata support for RAW formats and support of camera "maker notes"
  for Canon cameras. #1774 (1.9.0)
* New `maketx` option `--bumpslopes` specifically for converting bump maps,
  saves additional channels containing slope distribution moments that can
  be used in shaders for "bump to roughness" calculations. #1810,#1913,2005
  (1.9.2), #2044 (1.9.4)
* An official FindOpenImageIO.cmake that we invite you to use in other
  cmake-based projects that needs to find OIIO. #2027 (1.9.4)

Public API changes:
* **Python binding overhaul**
  The Python bindings have been reimplemented with
  [`pybind11`](https://github.com/pybind/pybind11), no longer with Boost.Python.
  #1801 (1.9.1)
  In the process (partly due to what's easy or hard in pybind11, but partly
  just because it caused us to revisit the python APIs), there are some minor
  API changes, some of which are breaking! To wit:
    * All of the functions that are passed or return blocks of pixels
      (such as `ImageInput.read_image()`) now use Numpy `ndarray` objects
      indexed as `[y][x][channel]` (no longer using old-style Python
      `array.array` and flattened to 1D).
    * Specilized enum type `ImageInput.OpenMode` has been replaced by string
      parameters, so for example, old `ImageInput.open(filename, ImageInput.Create)`
      is now `ImageInput.open (filename, "Create")`
    * Any function that previously took a parameter of type `TypeDesc`
      or `TypeDesc.BASETYPE` now will accept a string that signifies the
      type. For example, `ImageBuf.set_write_format("float")` is now a
      synonym for `ImageBuf.set_write_format(oiio.TypeDesc(oiio.FLOAT))`.
    * For several color conversion functions, parameter names were changed
      from "from" to "fromspace" and "to" to "tospace" to avoid a clash with
      the Python reserved word `from`. #2084
* **ImageInput API changes for thread safety and statelessness** #1927 (1.9.2)
    * `seek_subimage()` no longer takes an `ImageSpec&`, to avoid the obligatory
       copy. (If the copy is desired, just call `spec()` to get it afterwards.)
    * All of the `read_*()` methods now have varieties that take arguments
      specifying the subimage and mip level. The `read_native_*()` methods
      supplied by ImageInput subclass implementations now ONLY come in the
      variety that takes a subimage and miplevel.
    * All of the `read_*()` calls that take subimage/miplevel explicitly are
      guaranteed to be stateless and thread-safe against each other (it's not
      necessary to call `seek_subimage` first, nor to have to lock a mutex to
      ensure that another thread doesn't change the subimage before you get a
      chance to call read). For back-compatibility, there are still versions
      that don't take subimage/miplevel, require a prior call to seek_subimge,
      and are thus not considered thread-safe.
    * New methods `spec(subimage,miplevel)` and `spec_dimensions(s,m)`
      let you retrieve a copy of the ImageSpec for a given subimage and
      MIP level (thread-safe, and without needing a prior `seek_subimage`)
      call. Note that to be stateless and thread-safe, these return a COPY
      of the spec, rather than the reference returned by the stateful
      `spec()` call that has no arguments and requires a prior `seek_subimage`.
      However, `spec_dimensions()` does not copy the channel names or the
      arbitrary metadata, and is thus very inexpensive if the only thing
      you need from the spec copy is the image dimensions and channel
      formats.
* **ImageInput and ImageOutput create/open changes**
    * The static `create()` and `open()` methods have been changed so that
      instead of returning an `ImageInput *` (or `ImageOutput *`) and
      requiring the caller to correctly manage that resource and eventually
      destroy it, now they return a `unique_ptr` that automatically deletes
      when it leaves scope. In the process we also clean up some edge cases
      on Windows where it was possible for ImageInput/ImageOutput to have
      been allocated in one DLL's heap but freed in a different DLL's heap,
      which could cause subtle heap corruption problems. #1934,#1945 (1.9.3).
* **ImageBuf**
    * New method `set_origin()` changes the pixel data window origin.
      #1949 (1.9.4)
    * Assignment (`operator=`) is now enabled for ImageBuf, both the copying
      and moving variety. Also, an explicit copy() method has been added
      that returns a full copy of the ImageBuf. #1952 (1.9.4)
    * write() method has had its arguments changed and now takes an optional
      TypeDesc that lets you specify a requested data type when writing the
      output file, rather than requiring a previous and separate call to
      set_write_format(). The old call signature of write() still exists,
      but it will be considered deprecated in the future. #1953 (1.9.4)
* **ImageBufAlgo**
    * In C++, functions that take raw pointers for per-channel constant
      values or results are deprecated, in favor of new versions that
      heavily rely on `span<>` to safely pass array references and their
      lengths. #1961 (1.9.4)
    * In both C++ and Python, every IBA function that takes a parameter
      giving an ImageBuf destination reference for results have an additional
      variant that directly returns an ImageBuf result. This makes much
      cleaner, more readable code, in cases where it's not necessary to
      write partial results into an existing IB. #1961 (1.9.4)
    * In C++, many IBA functions that came in multiple versions for whether
      certain parameters could be an image, a per-channel constant, or a
      single constant, have been replaced by a single version that takes
      a new parameter-passing helper class, `Image_or_Const` that will match
      against any of those choices. (No changes are necessary for calling
      programs, but it makes the header and documentation a lot simpler.)
      #1961 (1.9.4)
    * IBA compare(), computePixelStats(), and histogram() now directly
      return their result structures, intead of requiring the passing of
      a destination reference. #1961 (1.9.4)
    * New IBA::fit() resizes and image to just fit in the given size, but
      preserve its aspect ratio (padding with black as necessary). It's just
      like what `oiiotool --fit` has always done, but now you can call it
      directly from C++ or Python. #1993 (1.9.4)
    * New `contrast_remap()` allows flexible linear or sigmoidal contrast
      remapping. #2043 (1.9.4)
    * `ImageBufAlgo::colorconvert` and various `ocio` transformations have
      changed the default value of their `unpremult` parameter from `false`
      to `true`, reflecting the fact that we believe this is almost always
      the more correct choice. Also, if their input image is clearly marked
      as having unasociated alpha already, they will not bracket the color
      conversion with the requested unpremult/premult. #1864 (1.9.2)
    * Updated the OpenCV interoperability with new functions to_OpenCV (make
      an ImageBuf out of a cv::Mat) and from_OpenCV (fill in a cv::Mat with
      the contents of an ImageBuf). Deprecated the old from_IplImage and
      to_IplImage, which are very OpenCV-1.x-centric. (2.0.2)
* **ImageCache/TextureSystem:**
    * ImageCache and TextureSystem now have `close(filename)` and
      `close_all()` methods, which for one file or all files will close the
      files and release any open file handles (also unlocking write access
      to those files on Windows), but without invalidating anything it knows
      about the ImageSpec or any pixel tiles already read from the files, as
      would happen with a call to the much more drastic `invalidate()` or
      `invalidate_all()`. #1950 (1.9.4)
    * `TextureSystem::create()` has an additional optional argument that
      allows the caller to pass an existing app-owned custom ImageCache.
      #2019 (1.9.4)
    * New `TextureSystem::imagecache()` method returns a blind, non-owning
      pointer to the underlying ImageCache of that TS. #2019 (1.9.4)
    * ImageCache: extended add_tile() with an optional `copy` parameter
      (which defaults to `true`), which when set to `false` will make a tile
      that references an app buffer without allocating, copying, and owning
      the memory. In short, this makes it possible to reference existing
      memory holding an image array, as if it were a texture. #2012 (1.9.4)
    * `ImageCache::add_file()` extended with an optional `replace` parameter
      (default: false), that if true, will replace the tile and invalidate
      the old one. #2021 (1.9.4)
* **Changes to string formatting**: #2076 (2.0.1)
    * New `Strutil::sprintf()` and `ustring::sprintf()` functions are for
      printf-style formatted errors and warnings. You are encouraged to
      change your existing `format()` calls to `sprintf()`, since the
      original `format` may in a later version (2.1?) switch to Python-style
      formatting commands, but `sprintf` will continue to reliably use
      C printf style notation.
    * In ImageInput, ImageOutput, ImageBuf, and ErrorHandler, new `errorf()`
      and `warningf()` methods similarly provide printf-style formatted
      errors and warnings. The old `error()/warning()` calls will someday
      (maybe 2.1?) switch to Python-style formatting commands, but
      `errorf` will continue to reliably use C printf style notation.
* ColorConfig changes: ColorConfig methods now return shared pointers to
  `ColorProcessor` rather than raw pointers. It is therefore no longer
  required to make an explicit delete call. Created ColorProcessor objects
  are now internally cached, so asking for the same color transformation
  multiple times is no longer expensive. The ColorProcessor interface is
  now in `color.h` and can be directly used to perform transformations on
  individual colors (previously it was just an opaque pointer and could
  only be used to pass into certain IBA functions). The color space names
  "rgb" and "default" are now understood to be synonyms for the default
  "linear" color space. #1788 (1.9.0)
* Remove long-deprecated API calls:
    * ImageBuf::get_pixels/get_pixel_channels varieties deprecated since 1.6.
    * ImageBuf::set_deep_value_uint, deprecated since 1.7.
    * ImageBuf::deep_alloc, deprecated since 1.7.
    * ImageBufAlgo::colorconvert variety deprecated since 1.7.
    * ImageCache::clear, deprecated since 1.7.
    * ImageCache::add_tile variety deprecated since 1.6.
* ROI new methods: contains()  #1874, #1878 (1.9.2)
* `ImageBufAlgo::pixeladdr()` now takes an additional optional parameter,
  the channel number. #1880 (1.9.2)
* Global OIIO attribute "log_times" (which defaults to 0 but can be overridden
  by setting the `OPENIMAGEIO_LOG_TIMES` environment variable), when nonzero,
  instruments ImageBufAlgo functions to record the number of times they are
  called and how much time they take to execute. A report of these times
  can be retrieved as a string as the "timing_report" attribute, or it will
  be printed to stdout automatically if the value of log_times is 2 or more
  at the time that the application exits. #1885 (1.9.2)
* Moved the definition of `ROI` from `imagebuf.h` to `imageio.h` and make
  most of the methods `constexpr`. #1906 (1.9.2)
* Rename/move of `array_view` to `span`. Deprecated `array_view` and moved
  array_view.h contents to span.h. You should change `array_view<T>`
  to `span<T>` and `array_view<const T>` to `cspan<T>`. #1956,2062 (1.9.4)
* ustring: removed `operator int()` that allowed simple int casting such as:
  ```
      ustring u, v;
      if (u || !v) { ... }
  ```
  This was error-prone, neither std::string nor std::string_view had the
  equivalent, so we are removing it. The preferred idiom is:
  ```
      if (!u.empty() || v.empty()) { ... }
  ```

Performance improvements:
* ImageBufAlgo::computePixelStats is now multithreaded and should improve by
  a large factor when running on a machine with many cores. This is
  particularly noticable for maketx. #1852 (1.9.2)
* Color conversions are sped up by 50% for 4 channel float images, about
  30% for other combinations of channels or data formats. #1868 (1.9.2)
* ImageBuf::get_pixels() sped up by around 3x for the common case of the
  image being fully in memory (the slower path is now only used for
  ImageCache-based images). #1872 (1.9.2)
* ImageBufAlgo::copy() and crop() sped up for in-memory buffers, by about
  35-45% when copying between buffers of the same type, 2-4x when copying
  between buffers of different data types. #1877 (1.9.2)
* ImageBufAlgo::over() when both buffers are in-memory, float, 4-channels,
  sped up by about 2x. #1879 (1.9.2).
* ImageBufAlgo::fill() of a constant color sped up by 1.5-2.5x (depending
  on the data type involved). #1886 (1.9.2)

Fixes and feature enhancements:
* oiiotool
    * `--help` prints important usage tips that explain command parsing,
      syntax of optional modifiers, and the path to PDF docs. #1811 (1.9.2)
    * `--colormap` has new  maps "inferno", "magma", "plasma", "viridis",
      which are perceptually uniform, monotonically increasing luminance,
      look good converted to greyscale, and usable by people with color
      blindness. #1820 (1.9.2)
    * oiiotool no longer enables autotile by default. #1856 (1.9.2)
    * `--colorconvert`, `--tocolorspace`, and all of the `--ocio` commands
      now take an optional modifier `:unpremult=1` which causes the color
      conversion to be internally bracketed by unpremult/premult steps (if
      the image has alpha and is not already marked as having unassociated
      alpha). You should therefore prefer `--colorconvert:unpremult=1 from to`
      rather than the more complex `--unpremult --colorconvert from to -premult`.
      #1864 (1.9.2)
    * `--autocc` will also cause unpremult/premult to bracket any color
      transformations it does automatically for read and write (if the image
      has alpha and does not appear to already be unassociated). #1864 (1.9.2)
    * `--help` prints the name of the OCIO color config file. #1869 (1.9.2)
    * Frame sequence wildcard improvements: fix handling of negative frame
      numbers and ranges, also the `--frames` command line option is not
      enough to trigger a loop over those frame numbers, even if no other
      arguments appear to have wildcard structure. #1894 (1.8.10/1.9.2)
    * `--info -v` now prints metadata in sorted order, making it easier to
      spot the existence of particular metadata. #1982 (1.9.4)
    * `--no-autopremult` fixed, it wasn't working properly for cases that
      were read directly rather than backed by ImageCache. #1984 (1.9.4)
    * New `--contrast` allows for contrast remapping (linear or sigmoidal).
      #2043 (1.9.4)
    * Improved logic for propagating the pixel data format through
      multiple operations, especially for files with multiple subimages.
      #1769 (1.9.0/1.8.6)
    * Outputs are now written to temporary files, then atomically moved
      to the specified filename at the end. This makes it safe for oiiotool
      to "overwrite" a file (i.e. `oiiotool in.tif ... -o out.tif`) without
      problematic situations where the file is truncated or overwritten
      before the reading is complete. #1797 (1.8.7/1.9.1)
    * Fixed problem with reading `half` files where very small (denormalized)
      half values could get squashed to float 0.0 instead of having their
      values preserved, if certain old versions of libopenjpeg were being
      used (because they set a CPU flag strangely upon library load and then
      never changed it back, this is a libopenjpeg bug that has since been
      fixed). #2048 (2.0)
    * `-d chan=type` logic fixed for certain cases of specifying the data
      types of individual channels. #2061 (2.0beta2)
    * Expression evaluation: metadata names can now be enclosed in single
      or double quotes if they don't follow "C" identifier naming conventions.
      For example, `{TOP.'foo/bar'}` retrieves metadata called "foo/bar"
      rather than trying to retrieve "foo" and divide by bar. #2068 (2.0beta2)
    * Expression evaluation: When retrieving metadata, timecode data will be
      expressed properly as a string ("00:00:00:00"). #2068 (2.0beta2)
* ImageBufAlgo:
    * `color_map()` supports new maps "inferno", "magma", "plasma",
      "viridis". #1820 (1.9.2)
    * Across many functions, improve channel logic when combining an image
      with alpha with another image without alpha. #1827 (1.9.2)
    * `mad()` now takes an `img*color+img` variety. (Previously it
       supported `img*img+img` and `img*color+color`.) #1866 (1.9.2)
    * New `fit()` is like resize but fits inside a specified window size,
      while preserving the aspect ratio of the image appearance. #1993.
    * New `contrast_remap()` allows flexible linear or sigmoidal contrast
      remapping. #2043 (1.9.4)
    * `channel_append()` is no longer limited to requiring the two input
      images to have the same pixel data type. #2022 (1.9.4)
    * `isConstantColor()`, `isConstantChannel()`, and `isMonochrome()` have
      added an optional `threshold` parameter that allows you to compute
      whether the image is constant or monochrome within a non-zero
      tolerance (the default is still 0.0, meaning checking for an exact
      match). #2049 (2.0.0)
    * `IBA::ociodisplay()` has better behavior when its "fromspace" parameter
      is left blank -- instead of assuming "linear" (as a space name), it
      assumes it's whatever space in your OCIO color config has the "linear"
      role. #2083 (1.8.17/2.0.1)
* ImageBuf:
    * Bug fixed in IB::copy() of rare types. #1829 (1.9.2)
    * write() automatically tells the ImageCache to 'invalidate' the file
      being written, so cached images will not retain the prior version of
      the files. #1916 (1.9.2)
    * Bug fix to ImageBuf::contains_roi() method -- it erroneously always
      returned `true`. #1997 (1.8.14/1.9.4)
* ImageCache/TextureSystem/maketx:
    * Improved stats on how long we wait for ImageInput mutexes.
      #1779 (1.9.0/1.8.6)
    * Improved performance of IC/TS tile and file caches under heavy
      contention from many threads. #1780 (1.9.0)
    * Increased the default `max_tile_channels` limit from 5 to 6.
      #1803 (1.9.1)
    * maketx: improved image hashing to avoid some (extremely rare) possible
      hash collisions. #1819 (1.9.2)
    * IC/TS performance improvements by changing the underlying hash table
      implementation. #1823,1824,1825,1826,1830 (1.9.2)
    * texture()/texture3d(): when requesting a nonexistent "subimage",
      return the fill color, like we do when requesting nonexistent channels
      (rather than nondeterministically simply not filling in the result).
      #1917 (1.9.2)
    * Relying on some changes to the ImageInput API, there is now much less
      thread locking to protect the underlying ImageInputs, and this should
      improve texture and image cache performance when many threads need
      to read tiles from the same file. #1927 (1.9.2)
    * `get_image_info()`/`get_texture_info()` is now more flexible about
      retrieving arrays vs aggregates, in cases where the total number of
      elements is correct. #1968 (1.9.4)
    * Fix uninitialized read within the texture system (only affected
      statistics, never gave wrong texture results). #2000 (1.9.4)
    * texture3d() transforms lookup points from world into local space
      if the file has a "worldtolocal" metadata giving a 4x4 matrix. #2009
      (1.9.4)
    * Fix minor texture filtering bug where widely disparate "sblur" and
      "tblur" values could in some circumstances lead to incorrect texture
      filter estimation. #2052 (2.0.0)
    * `ImageCache::invalidate(filename)` did not properly invalidate the
      "fingerprint" is used to detect duplicate files. #2081 (1.8.17/2.0.1)
* iv:
    * Fix (especially on OSX) for various ways it has been broken since the
      shift to Qt5. #1946 (1.8.12, 1.9.4)
    * New optin `--no-autopremult` works like oiiotool, causes images with
      unassociated alpha to not be automatically premultiplied by alpha
      as they are read in. #1984 (1.9.4)
* All string->numeric parsing and numeric->string formatting is now
  locale-independent and always uses '.' as decimal marker. #1796 (1.9.0)
* Python Imagebuf.get_pixels and set_pixels bugs fixed, in the varieties
  that take an ROI to describe the region. #1802 (1.9.2)
* Python: Implement missing `ImageOutput.open()` call variety for declaring
  multiple subimages. #2074 (2.0.1)
* More robust parsing of XMP metadata for unknown metadata names.
  #1816 (1.9.2/1.8.7)
* Fix ImageSpec constructor from an ROI, display/"full" window did not get
  the right default origin. #1997 (1.8.14/1.9.4)
* ImageSpec::erase_attribute() fix bug where it got case-sensitivity of the
  search backwards when built using std::regex rather than boost::regex.
  #2003 (1.8.14/1.9.4)
* DPX:
    * Better catching of write errors, including filling the disk while in
      the process of writing a DPX file. #2072 (2.0.1)
* Field3d:
    * Prevent crashes when open fails. #1848 (1.9.2/1.8.8)
    * Fix potential mutex deadlock. #1972 (1.9.4)
* GIF:
    * Fix crash when reading GIF with comment extension but no comment data.
      #2001 (1.8.14/1.9.4)
* JPEG:
    * When writing, be robust to accidentally setting the "density" metadata
      to values larger than JPEG's 16 bit integer field will accommodate.
      #2002 (1.8.14/1.9.4)
    * Better detection and reporting of error conditions while reading
      corrupt JPEG files. #2073 (2.0.1)
* OpenEXR:
    * Gracefully detect and reject files with subsampled channels,
      which is a rarely-to-never-used OpenEXR feature that we don't support
      properly. #1849 (1.9.2/1.8.8)
    * Improved handling of UTF-8 filenames on Windows. #1941 (1.9.3, 1.8.12,
      1.7.19)
* PNG:
    * Fix redundant png_write_end call. #1910 (1.9.2)
* PSD:
    * Fix parse issue of layer mask data. #1777 (1.9.2)
* RAW:
    * Add "raw:HighlightMode" configuration hint to control libraw's
      handling of highlight mode processing. #1851
    * Important bug fix when dealing with rotated (and vertical) images,
      which were not being re-oriented properly and could get strangely
      scrambled. #1854 (1.9.2/1.8.9)
    * Major rewrite of the way makernotes and camera-specific metadata are
      handled, resulting in much more (and more accurate) reporting of
      camera metadata. #1985 (1.9.4)
    * The "oiio:ColorSpace" metadata is now set correctly when reading
      raw DSLR images. And we deprecate the old "raw:ColorSpace" metadata,
      which is useless. #2016 (1.9.4)
    * Add "raw:aber" configuration hint to control libraw's adjustments for
      chromatic aberration. This data is of type "float[2]", the first value
      is the scale factor for red, the second for blue, and both should be
      very close to 1.0. #2030 (1.9.4)
* TIFF:
    * Improve performance of TIFF scanline output. #1833 (1.9.2)
    * Bug fix: read_tile() and read_tiles() input of un-premultiplied tiles
      botched the "shape" of the tile data array. #1907 (1.9.2/1.8.10)
    * Improvement in speed of reading headers (by removing redundant call
      to TIFFSetDirectory). #1922 (1.9.2)
    * When config option "oiio:UnassociatedAlpha" is nonzero (or not set
      -- which is the default), therefore enabling automatic premultiplication
      by alpha for any unassociated alpha files, it will set the metadata
      "tiff:UnassociatedAlpha" to indicate that the original file was
      unassociated. #1984 (1.9.4)
    * Bug fixes for TIFF reads of images with unassociated alpha -- there
      were some edge cases where they pixels failed to automatically
      premultiply upon read. #2032 (1.9.4)
* zfile: more careful gzopen on Windows that could crash when given bogus
  filename. #1839,2070 (1.9.2/1.8.8/2.0.1)
* Windows fix: Safer thread pool destruction on. #2038 (1.9.4)

Build/test system improvements and platform ports:
* Fixes for Windows build. #1793, #1794 (1.9.0/1.8.6), #2025 (1.9.4)
* Fix build bug where if the makefile wrapper got `CODECOV=0`, it would
  force a "Debug" build (required for code coverage tests) even though code
  coverage is instructed to be off. (It would be fine if you didn't specify
  `CODECOV` at all.) #1792 (1.9.0/1.8.6)
* Build: Fix broken build when Freetype was not found or disabled. #1800
  (1.8.6/1.9.1)
* Build: Boost.Python is no longer a dependency, but `pybind11` is. If
  not found on the system, it will be automatically downloaded. #1801, #2031
  (1.9.1)
* Time for a multi-core build of OIIO is reduced by 40% by refactoring some
  extra big modules into more bite-sized pieces. #1806 (1.9.2)
* testtex:
    * Make the "thread workout" cases all honor `--handle`. #1778 (1.9.0)
    * Only prints detailed stats if `-v` is used, and new option
      `--invalidate` will invalidate the cache when starting each
      threadtimes trial. #1828 (1.9.2)
    * New `--anisoratio` lets you choose anisotropic shape for thread
      working tests, and make thread_workout samples twice as big to be more
      typical by interpolating mip levels. #1840 (1.9.2)
    * TextureSystem stats are printed as well as ImageCache. #1840 (1.9.2)
* iv no longer requires GLEW, using QOpenGLFunctions instead. #1840 (1.9.2)
* DICOM: Fix dcmtk build errors on some platforms. Also, the minimum dcmtk
  version we support is 3.6.1. #1843 (1.9.2/1.8.8)
* Build fixes for Hurd OS. #1850 (1.9.2/1.8.8)
* Clean up leak sanitizer errors. #1855 (1.9.2)
* On Unix/Linux, add explicit DL library dependency to libOpenImageIO.so
  itself instead of only to the binaries and test utilities.
  #1860 (1.9.2/1.8.8)
* The build now bundles a sample OCIO config in testsuite/common so that we
  can do OCIO-based unit tests. #1870 (1.9.2)
* Properly find newer openjpeg 2.3. #1871 (1.9.2)
* Fix testsuite to be Python 2/3 agnostic. #1891 (1.9.2)
* Removed `USE_PYTHON3` build flag, which didn't do anything. #1891 (1.9.2)
* The `PYTHON_VERSION` build variable is now better at selecting among
  several installed versions of Python, and all the tests should work fine
  with Python 3.x now. #2015 (1.9.4)
* Remove some lingering support for MSVS < 2013 (which we haven't advertised
  as working anyway). #1887 (1.9.2)
* Windows/MSVC build fix: use the `/bigobj` option on some large modules
  that need it. #1900, #1902 (1.8.10/1.9.2)
* Add up-to-date Nuke versions to FindNuke.cmake. #1920 (1.8.11, 1.9.2)
* Allow building against ffmpeg 4.0. #1926,#1936 (1.8.11, 1.9.2)
* Disable SSE for 32 bit Windows -- problematic build issues.
  #1933 (1.9.3, 1.8.12, 1.7.19)
* Fixes to the `EMBEDPLUGINS=0` build case, which had at some point stopped
  working properly. #1942 (1.9.3)
* Improvements in finding the location of OpenJPEG with Macports.
  #1948 (1.8.12, 1.9.4)
* Improvement finding libraw properly on Windows. #1959 (1.9.4)
* Fix warnings to allow clean gcc8 builds. #1974 (1.9.4)
* Make sure we build properly for C++17. (1.9.4)
* Check properly for minimal FFMpeg version (2.6). #1981 (1.9.4)
* New build option GLIBCXX_USE_CXX11_ABI, when set to 0 will force the old
  gcc string ABI (even gcc 7+ where the new ABI is the default), and if set
  to 1 will force the new gcc string ABI (on gcc 5-6, where old ABI is the
  default). If not set at all, it will respect the default choice for that
  compiler. #1980 (1.9.4)
* TravisCI builds now use an abbreviated test matrix for most ordinary
  pushes of working branches, but the full test matrix for PRs or pushes
  to "master" or "RB" branches. #1983 (1.9.4)
* Support compilation by clang 7.0. #1995 (1.9.4)
* Support for building against OpenEXR 2.3. #2007 (1.9.4)
* Use OpenEXR pkgconfig if available. #2008 (1.9.4)
* Allow builds outside the source tree to pass testsuite. Defaults to
  finding test image directories such as oiio-images, openexr-images, and
  libtiffpic in the usual ".." from the main OIIO source directory, but now
  it can be overridden with the CMake variable `OIIO_TESTSUITE_IMAGEDIR`.
  #2026 (1.9.4)
* Remove stale python examples from `src/python`. They were untested,
  undocumented, and probably no longer worked against the current APIs.
  #2036 (1.9.4)
* Fixes for Windows when making Unicode builds, and fix Plugin::dlopen
  on Windows to properly support UTF-8 filenames. #1454 (2.0.1)
* Support added for OpenCV 4.0. (2.0.1)

Developer goodies / internals:
* **Formatting with clang-format**: All submissions are expected to be
  formatted using our standard clang-format rules. Please run
  `make clang-format` prior to submitting code. The TravisCI tests include
  one entry just to check that the formatting conforms, and will fail if it
  doesn't, printing the diffs that would bring it to proper formatting.
  (Note: for small changes, if you don't have clang-format locally, it's ok
  to submit, then use the diffs from the failures to fix it by hand and
  resubmit and update.) #2059,2064,2065,2067,2069.
* argparse.h:
    * Add pre- and post-option help printing callbacks. #1811 (1.9.2)
    * Changed to PIMPL to hide implementation from the public headers.
      Also modernized internals, no raw new/delete. #1858 (1.9.2)
* array_view.h:
    * Added begin(), end(), cbegin(), cend() methods, and new
      constructors from pointer pairs and from std::array. (1.9.0/1.8.6)
    * Deprecated, moved contents to span.h. You should change `array_view<T>`
      to `span<T>` and `array_view<const T>` to `cspan<T>`. #1956 (1.9.4)
* color.h: add guards to make this header safe for Cuda compilation.
  #1905 (1.9.2/1.8.10)
* filesystem.h:
    * IOProxy classes that can abstract file operations for custom I/O
      substitutions. #1931 (1.9.3)
    * Proper UTF-8 filenames for unique_path() and temp_directory(), and
      general UTF-8 cleanup/simplification. #1940 (1.9.3, 1.8.12, 1.7.19)
    * Remove extraneous calls to exists() that were doubling the number
      of stat syscalls. #2385 (2.1.8)
* fmath.h:
    * Now defines preprocessor symbol `OIIO_FMATH_H` so other files can
      easily detect if it has been included. (1.9.0/1.8.6)
    * Modify to allow Cuda compilation/use of this header. #1888,#1896
      (1.9.2/1.8.10)
    * Improve numeric approximation of fast_atan() and fast_atan2().
      #1943 (1.9.3)
    * fast_cbrt() is a fast approximate cube root (maximum error 8e-14,
      about 3 times faster than pow computes cube roots). #1955 (1.9.4)
* function_view.h: Overhauled fixed with an alternate implementation
  borrowed from LLVM. (1.9.4)
* hash.h: add guards to make this header safe for Cuda compilation.
  #1905 (1.9.2/1.8.10)
* imageio.h: `convert_image()` and `parallel_convert_image` have been
  simplified to remove optional `alpha_channel` and `z_channel` parameters
  that were never actually used. The old versions are still present but
  are deprecated. #2088 (2.0.1)
* parallel.h:
    * `parallel_options` passed to many functions. #1807 (1.9.2)
    * More careful avoidance of threads not recursively using the thread
      pool (which could lead to deadlocks). #1807 (1.9.2)
    * Internals refactor of task_set #1883 (1.9.2).
    * Make the thread pool better behaved in times if pool congestion -- if
      there are already way too many items in the task queue, the caller may
      do the work itself rather than add to the end and have to wait too
      long to get results. #1884 (1.9.2)
* paramlist.h:
    * ParamValue class has added get_int_indexed() and get_float_indexed()
      methods. #1773 (1.9.0/1.8.6)
    * ParamValue restructured to allow additional common data types to store
      internally rather than requre an allocation. #1812 (1.9.2)
    * New ParamList convenience methods: remove(), constains(),
      add_or_replace(). #1813 (1.9.2)
* platform.h:
    * New OIIO_FALLTHROUGH and OIIO_NODISCARD macros, and renamed
      OIIO_UNUSED_OK to OIIO_MAYBE_UNUSED (to match C++17 naming). #2041
* simd.h:
    * Fixed build break when AVX512VL is enabled. #1781 (1.9.0/1.8.6)
    * Minor fixes especially for avx512. #1846 (1.9.2/1.8.8) #1873,#1893
      (1.9.2)
* span.h:
    * Used to be array_view. Now it's `span<>` and `span_strided`. Also,
      `cspan<T>` is a handy alias for `span<const T>`. #1956 (1.9.4)
    * Added begin(), end(), cbegin(), cend() methods, and new
      constructors from pointer pairs and from std::array. (1.9.0/1.8.6)
    * Added `==` and `!=` to span and span_strided. #2037 (1.9.4)
* strutil.h:
    * All string->numeric parsing and numeric->string formatting is now
      locale-independent and always uses '.' as decimal marker. #1796 (1.9.0)
    * New `Strutil::stof()`, `stoi()`, `stoui()`, `stod()` functions for
      easy parsing of strings to numbers. Also tests `Strutil::string_is_int()`
      and `string_is_float()`. #1796 (1.9.0)
    * New `to_string<>` utility template. #1814 (1.9.2)
    * Fix to strtof, strtod for non-C locales. #1918 (1.8.11, 1.9.2)
    * New `iless()` is case-insensitive locale-independent string_view
      ordering comparison. Also added StringIEqual, StringLess, StringILess
      functors. (1.9.4)
    * `join()` is now a template that can act on any iterable container of
      objects that allow stream output. #2033 (1.9.4)
    * New `splits()`/`splitsv()` that direction returns a vector of
      std::string or string_view, respectively. #2033 (1.9.4)
    * A second version of `extract_from_list_string` that directly returns
      a std::vector (instead of being passed as a param). #2033 (1.9.4)
    * `parse_string` now accepts single quotes as well as double quotes
      to enclose a quoted string. #2066 (2.0beta2)
    * Fix Strutil::vsnprintf detection of encoding errors on Windows. #2082
      (1.8.17/2.0.1)
    * `parse_string()` - fix bugs that would fail for escaped quotes within
      the string. #2386 (2.1.8)
* thread.h:
    * Reimplementation of `spin_rw_mutex` has much better performance when
      many threads are accessing at once, especially if most of them are
      reader threads. #1787 (1.9.0)
    * task_set: add wait_for_task() method that waits for just one task in
      the set to finish (versus wait() that waits for all). #1847 (1.9.2)
    * Fix rare crash in thread pool when lowering the number of threads.
      #2013 (1.9.4/1.8.15)
* unittest.h:
    * Made references to Strutil fully qualified in OIIO namespace, so that
      `unittest.h` can be more easily used outside of the OIIO codebase.
      #1791 (1.9.0)
    * `OIIO_CHECK_EQUAL_APPROX` - fix namespace ambiguity. #1998 (1.9.4)
    * `OIIO_CHECK_EQUAL` now can compare two `std::vector`s. #2033 (1.9.4)
    * Make unit test errors respect whether stdout is a terminal when
      deciding whether to print in color. #2045
* Extensive use of C++11 `final` and `override` decorators of virtual
  methods in our internals, especially ImageInput and ImageOutput.
  #1904 (1.9.2)

Notable documentation changes:
* A new THIRD-PARTY.md file reproduces the full open source licenses
  of all code that we distribute with OIIO, incorporate, or derive code from.
  They are have very similar license terms to the main OIIO license
  ("New BSD") -- MIT, Mozilla, Apache 2.0, or public domain. OIIO does not
  use any GPL or other "viral" licenesed code that would change license
  terms of any code that didn't come directly from those packages.
* The CHANGES.md file was getting truly enormous, so we have split the
  release notes from the 0.x and 1.x releases into separate files found
  in src/doc. So CHANGES.md only documents 2.0 and beyond.

--------------

For older release notes, see:
* [CHANGES-0.x](https://github.com/AcademySoftwareFoundation/OpenImageIO/blob/master/src/doc/CHANGES-0.x.md).
* [CHANGES-1.x](https://github.com/AcademySoftwareFoundation/OpenImageIO/blob/master/src/doc/CHANGES-1.x.md).