From b3e839ab751f8319fd3d5840ba9ee89c8c5f1fcc Mon Sep 17 00:00:00 2001 From: emma-bailey Date: Fri, 5 Jun 2026 15:13:34 +0200 Subject: [PATCH 01/11] Add _probeInfo.json as an option --- mne/io/nirx/nirx.py | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/mne/io/nirx/nirx.py b/mne/io/nirx/nirx.py index 766986c4612..4ac60ecfe1a 100644 --- a/mne/io/nirx/nirx.py +++ b/mne/io/nirx/nirx.py @@ -119,7 +119,6 @@ def __init__(self, fname, saturated, *, preload=False, encoding=None, verbose=No "description.json", "wl1", "wl2", - "probeInfo.mat", "tri", ) else: @@ -132,7 +131,6 @@ def __init__(self, fname, saturated, *, preload=False, encoding=None, verbose=No "wl1", "wl2", "config.txt", - "probeInfo.mat", ) n_dat = len(glob.glob(f"{fname}/*{'dat'}")) if n_dat != 1: @@ -175,6 +173,21 @@ def __init__(self, fname, saturated, *, preload=False, encoding=None, verbose=No nan_mask[key] = files[key][0 if noidx == 1 else 1] files[key] = files[key][fidx] + # Locate probeInfo file — either .mat (legacy) or .json (newer Aurora) + probe_mat = glob.glob(f"{fname}/*probeInfo.mat") + probe_json = glob.glob(f"{fname}/*probeInfo.json") + if len(probe_json) == 1: + files["probeInfo"] = probe_json[0] + probe_format = "json" + elif len(probe_mat) == 1: + files["probeInfo"] = probe_mat[0] + probe_format = "mat" + else: + raise RuntimeError( + f"Need one probeInfo.mat or probeInfo.json file, " + f"got {len(probe_mat)} .mat and {len(probe_json)} .json" + ) + # Read number of rows/samples of wavelength data with _open(files["wl1"]) as fid: last_sample = fid.read().count("\n") - 1 @@ -361,12 +374,21 @@ def __init__(self, fname, saturated, *, preload=False, encoding=None, verbose=No # Sources and detectors are both called optodes # Each source - detector pair produces a channel # Channels are defined as the midpoint between source and detector - mat_data = loadmat(files["probeInfo.mat"]) - probes = mat_data["probeInfo"]["probes"][0, 0] - requested_channels = probes["index_c"][0, 0] - src_locs = probes["coords_s3"][0, 0] / 100.0 - det_locs = probes["coords_d3"][0, 0] / 100.0 - ch_locs = probes["coords_c3"][0, 0] / 100.0 + if probe_format == "json": + with open(files["probeInfo"], encoding="utf-8") as _f: + _probe_json = json.load(_f) + probes = _probe_json["probeInfo"]["probes"] + requested_channels = np.array(probes["index_c"]) + src_locs = np.array(probes["coords_s3"]) / 1000.0 + det_locs = np.array(probes["coords_d3"]) / 1000.0 + ch_locs = np.array(probes["coords_c3"]) / 1000.0 + else: + mat_data = loadmat(files["probeInfo"]) + probes = mat_data["probeInfo"]["probes"][0, 0] + requested_channels = probes["index_c"][0, 0] + src_locs = probes["coords_s3"][0, 0] / 100.0 + det_locs = probes["coords_d3"][0, 0] / 100.0 + ch_locs = probes["coords_c3"][0, 0] / 100.0 # These are all in MNI coordinates, so let's transform them to # the Neuromag head coordinate frame From 912765fdb7ccfd5d4e92d5405b9f8d4b10b053af Mon Sep 17 00:00:00 2001 From: emma-bailey Date: Fri, 5 Jun 2026 15:14:31 +0200 Subject: [PATCH 02/11] Optional optipng.exe for documentation in windows --- doc/OptiPNG.url | 2 + doc/doc/authors.txt | 31 +++ doc/doc/history.txt | 435 ++++++++++++++++++++++++++++++++++++++++ doc/doc/license.txt | 21 ++ doc/doc/optipng.man.pdf | Bin 0 -> 42393 bytes doc/doc/optipng.man.txt | 299 +++++++++++++++++++++++++++ doc/doc/todo.txt | 42 ++++ 7 files changed, 830 insertions(+) create mode 100644 doc/OptiPNG.url create mode 100644 doc/doc/authors.txt create mode 100644 doc/doc/history.txt create mode 100644 doc/doc/license.txt create mode 100644 doc/doc/optipng.man.pdf create mode 100644 doc/doc/optipng.man.txt create mode 100644 doc/doc/todo.txt diff --git a/doc/OptiPNG.url b/doc/OptiPNG.url new file mode 100644 index 00000000000..9796437165b --- /dev/null +++ b/doc/OptiPNG.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=http://optipng.sourceforge.net/ diff --git a/doc/doc/authors.txt b/doc/doc/authors.txt new file mode 100644 index 00000000000..0245e5ab1be --- /dev/null +++ b/doc/doc/authors.txt @@ -0,0 +1,31 @@ +# OptiPNG version 0.7.8 +# Copyright (C) 2001-2023 Cosmin Truta and the Contributing Authors. +# See the accompanying LICENSE file for details. +# +# A Contributing Author is a person or company who contributed code that +# is now part of OptiPNG. +# +# For the purpose of copyright and licensing, this is the official list +# of Contributing Authors, in alphabetic order. + +Adam Ciarcinski +Brian McQuade +Elias Pipping +Fabien Barbier +Friedrich Preuss +Maciej Pilichowski +Matthew Fearnley +Nelson A. de Oliveira +Niels de Koning +Oliver Schneider +Petr Gajdos +Piotr Bandurski +Priit Laes +Ramona C. Truta +Sebastian Pipping +Stefan Brüns +Thomas Hurst +Till Maas +Ville Skyttä +Vincent Lefèvre +Yuen Ho Wong diff --git a/doc/doc/history.txt b/doc/doc/history.txt new file mode 100644 index 00000000000..ccd3746dc2e --- /dev/null +++ b/doc/doc/history.txt @@ -0,0 +1,435 @@ +OptiPNG - Revision history +========================== + +Legend +------ +++ Added or improved performance-related feature + (might improve compression ratio or processing speed). + + Added or improved feature. + - Removed feature. + ! Fixed bug. +!! Fixed critical bug + (crash, data/metadata loss or security hazard). + * Other modification (e.g. architectural improvement). + +Version 0.7.8 2023-nov-03 +------------- + * Upgraded libpng to version 1.6.40. + * Upgraded zlib to version 1.3-optipng. + * Upgraded cexcept to version 2.0.2-optipng. +!! Fixed a global-buffer-overflow vulnerability in the GIF reader. + [Reported by Zeng Yunxiang; fixed by Thomas Hurst] + ! Fixed a stack-print-after-scope defect in the error handler. + ! Fixed an assertion failure in the image reduction module. + ! Fixed the command-line wildargs expansion in the Windows port. + * Raised the minimum required libpng version from 1.2.9 to 1.6.35. + * Raised the minimum required zlib version from 1.2.1 to 1.2.8. + * Refactored the structured exception handling. + +Version 0.7.7 2017-dec-27 +------------- + * Upgraded libpng to version 1.6.34. + * Upgraded zlib to version 1.2.11-optipng. + * Upgraded minitiff to version 0.2. +!! Fixed a buffer overflow vulnerability in the GIF decoder. + [Reported by Joonun Jang] +!! Fixed an integer overflow vulnerability in the TIFF decoder. + [Reported by Jaeseung Choi] + ! Fixed the build on macOS High Sierra. + [Reported by various users] + [Fixed by Yuen Ho Wong and Friedrich Preuss] + ! Fixed the build on DJGPP. + * Disallowed out-of-bounds values in rangeset options. + +Version 0.7.6 2016-apr-03 [Released by Ramona C. Truta] +------------- + * Upgraded libpng to version 1.6.21. + ! Fixed an assertion failure in the image reduction code. + [Fixed by upgrading libpng] +!! Fixed various security-sensitive defects in the BMP decoder. + [Reported by Henri Salo and Hans Jerry Illikainen] + [Fixed by Ramona C. Truta] + ! Fixed a benign uninitialized memory read in the GIF decoder. + [Reported by Gustavo Grieco] + ! Fixed a build failure occurring under the Estonian (et_EE) locale. + [Reported by Sebastian Pipping] + [Fixed by Priit Laes] + ! Fixed a build failure occurring on Mac OS X, FreeBSD, and possibly + other systems that lack POSIX-compliant high-resolution timestamps. + [Reported by Ryan Schmidt and Dmitry Egorov] + [Contributed by Sebastian Pipping] + ! Fixed a typo causing build failures in 32-bit ANSI C compilation. + [Reported by various users] + +Version 0.7.5 2014-mar-24 +------------- + * Upgraded libpng to version 1.6.10-optipng. + * Upgraded zlib to version 1.2.8-optipng. + ! Fixed various build issues with libpng-1.5 and libpng-1.6. + [Fixed by Oliver Schneider] + * Allowed the handling of huge image files (> millions of pixels + per row or column) to be independent of the libpng version. + + Allowed the option -preserve to save the file ownership (UID/GID) + on Unix. + [Requested by Otto Kekäläinen] + ! Fixed a build issue with Clang. + + Added various enhancements to the configure script. + +Version 0.7.4 2012-oct-21 +------------- +!! Fixed the previous fix, which failed to fix the option -fix. + [Reported by Gynvael Coldwind and Mateusz Jurczyk] + +Version 0.7.3 2012-sep-16 +------------- +!! Fixed a use-after-free vulnerability in the palette reduction code. + This vulnerability was accidentally introduced in version 0.7. + +Version 0.7.2 2012-aug-24 +------------- + * Upgraded libpng to version 1.4.12. + * Upgraded zlib to version 1.2.7-optipng. + ! Fixed the display of huge (4GB+) file/IDAT sizes on 32-bit platforms. + ! Issued a proper error message if the output IDAT can't fit in 2GB. + Acknowledged this limitation in the user manual. + [Reported by John Sauter] + ! Fixed the output file cleanup that should occur after a write error. + * Added the option -debug and various undocumented debug features. + * Moved the PNG reduction module (opngreduc) to a separate sub-project. + +Version 0.7.1 2012-mar-19 [Released by Ramona C. Truta] +------------- +!! Fixed a regression in the reduction of palette-encoded grayscale + images. (This regression was introduced in version 0.7.) + [Fixed by Adam Ciarcinski] + +Version 0.7 2012-feb-29 [Released by Cosmin & Ramona C. Truta] +----------- + * Upgraded libpng to version 1.4.9. + * Upgraded zlib to version 1.2.6-optipng. +!! Fixed a rarely-occurring out-of-bounds memory access error in + the Z_RLE strategy in zlib. + [Reported by Christopher Wichura] + [Fixed by upgrading zlib] + + Added the popularly-requested option -strip. + The only suboption currently supported is "-strip all". + + Added the option -clobber. + [Contributed by Maciej Pilichowski] + + Added the option -backup, as an alias of -keep. + [Contributed by Ramona C. Truta] + + Added the option -silent, as an alias of -quiet. + [Contributed by Ramona C. Truta] + - Deprecated the option -log. + [Contributed by Ramona C. Truta] + * Changed the activity display output from STDOUT to STDERR. + + Allowed the option -preserve to save high-resolution timestamps + on Unix, if the POSIX-1.2008 API is available. + (This feature was previously available on Windows only.) + ! Fixed a minor precision error in the display of file size percents. + ! Fixed a memory leak that occurred when reading broken GIF images. + ! Fixed various build issues. + [Fixed by Sebastian Pipping and Ville Skyttä] + * Resolved all remaining compatibility issues with libpng-1.5. + [Contributed by Adam Ciarcinski] + * Added build support for clang. + * Reorganized the source directory structure. + +Version 0.6.5 2011-jan-24 +------------- + * Upgraded libpng to version 1.4.5-optipng. + * Upgraded zlib to version 1.2.5-optipng. +!! Fixed the I/O states (in libpng 1.4.5); + they caused incorrect file reads in some rare cases. + [Reported by Dmitry Marakasov] +!! Fixed processing of PNG files with chunks of size 0. + [Reported by Matthew Fearnley] + ! Fixed a display error in the TIFF import. + [Fixed by Piotr Bandurski] + + Improved checking of the arguments of -f, -zc, -zm and -zs. + - Removed quirks from the rangeset option argument syntax. + ! Fixed a build issue under the system-supplied libpng-1.4. + [Fixed by Petr Gajdos] + * Resolved forward-compatibility issues regarding libpng-1.5; + however, the system-supplied libpng-1.5 is not yet supported. + * Added various enhancements to the configure+make build system. + [Contributed by Elias Pipping and Dmitri Zubko] + +Version 0.6.4 2010-mar-14 +------------- + * Upgraded libpng to version 1.4.1-optipng. + * Upgraded zlib to version 1.2.4-optipng. + + Added the option -nx. + * Clarified the behavior of the option -nz and the relationship between + the options -nz and -o0. + + Added a filesystem check (resolving normalized paths, symlinks, etc.) + to better detect when the output overwrites the input. + + Enabled automatic wildcard expansion (i.e. globbing) on Win64. + ! Fixed a Unicode build issue on Windows. + [Fixed by Fabien Barbier] + +Version 0.6.3 2009-may-18 +------------- + * Upgraded libpng to version 1.2.36-optipng. +!! Fixed a use-after-free error in the GIF reader. + [Reported by Roy Tam] + [Fixed by Bryan McQuade] + ! Flushed the output log to display the current trial in real time. + This only worked on Windows in the previous version. + [Fixed by Vincent Lefèvre] + ! Fixed an error in reporting unrecognized file formats. + - Removed the requirement to "fix" TIFF files that contain unrecognized + metadata. + [Requested by Piotr Bandurski] + * Simplified the option abbreviation rules. Option names can now be + abbreviated to their shortest unique prefix, as in X11 applications. + +Version 0.6.2 2008-nov-09 +------------- + * Upgraded libpng to version 1.2.33-optipng. +++ Put back a speed optimization, accidentally removed in version 0.6, + allowing singleton trials (-o1) to be bypassed in certain conditions. +!! Fixed an array overflow in the BMP reader. +!! Fixed the loss of private chunks under the option -snip. + + Produced a more concise on-screen output in the non-verbose mode. + [Contributed by Vincent Lefèvre] + * Added a programming interface to the optimization engine, in order + to facilitate the development of PNG-optimizing GUI apps and plugins. + +Version 0.6.1 2008-jul-20 +------------- + * Upgraded cexcept to version 2.0.1. + + Added a configure script, to be used instead of unix-secure.mak. + ! Fixed a build issue that occurred when using libpng from the system. + [Reported by Nelson A. de Oliveira] + ! Fixed the processing when the image reduction yields an output larger + than the original. + [Reported by Michael Krishtopa] + ! Fixed the behavior of the option -preserve. + [Reported by Bill Koch] + - Removed displaying of partial progress when abandoning IDATs under + the option -v. (The percentages displayed were not very accurate.) + +Version 0.6 2008-jun-15 +----------- + * Upgraded libpng to version 1.2.29-optipng. +++ Implemented grayscale(alpha)-to-palette reductions. +++ Improved conversion of bKGD info during RGB-to-palette reductions. + [Contributed by Matthew Fearnley] +!! Fixed conversion of bKGD and tRNS during 16-to-8-bit reductions. + [Reported by Matthew Fearnley] + + Added support for compressed BMP (incl. PNG-compressed BMP, you bet!) + + Improved the speed of reading raw PNM files. + + Recognized PNG digital signatures (dSIG) and disabled optimization + in their presence, to preserve their integrity. + + Allowed the user to enforce the optimization of dSIG'ed files. + + Recognized APNG animation files and disabled reductions to preserve + their integrity. + + Added the option -snip, to allow the user to snip one image out of + a multi-image file, such as animated GIF, multi-page TIFF, or APNG. + + Improved recovery of PNG files with incomplete IDAT. +!! Fixed a crash triggered by the use of -log on some platforms. + [Fixed by Stefan Brüns] + ! Fixed the behavior of the options -out and -dir when the input is + already optimized. + [Reported by Christian Davideck] + * Provided more detailed image information at the start of processing. + * Provided a more detailed summary at the end of processing, under the + presence of the option -v and/or the occurrence of exceptional events. + +Version 0.5.5 2007-jan-28 +------------- + * Upgraded libpng to version 1.2.15-optipng. +++ Used a previously-missed RGB-to-palette reduction opportunity + for images containing 256 distinct colors. + [Reported by Joachim Kluge] +!! Fixed conversion of bKGD info during RGB-to-palette reductions. + [Reported by Matthew Fearnley] + ! Fixed pre-computation of iterations. + [Reported by Matthew Fearnley] + ! Eliminated a false alarm when processing RGB images with tRNS + in Unix-secure mode. + [Reported by Till Maas] + [Fixed by Nelson A. de Oliveira] + ! Fixed the behavior of the options -out and -dir when changing + interlacing. + [Reported by Martin Packman] + ! Fixed the behavior of "-dir [DRIVE]:" on Windows. + +Version 0.5.4 2006-aug-11 +------------- + + Added the options -out and -dir, to specify the name of the + output file or directory. + [Requested by Alexander Lucas] + * Added support for builds based on the system-supplied libpng. + [Contributed by Nelson A. de Oliveira] + +Version 0.5.3 2006-jul-23 +------------- + * Upgraded libpng to version 1.2.12-optipng. + + Implemented basic support for TIFF (grayscale, RGB and RGBA, + uncompressed). +++ Avoided the redundant trial when the search space is singular + (e.g. when running "optipng -o1 example.tif"). + + Prevented accidental file corruption when using the option -log. + ! Fixed (again) a small typo in the online help. + +Version 0.5.2 2006-may-07 +------------- + + Improved handling of inexact PNM-to-PNG conversions. + ! Fixed a typo that was breaking the build on some Unix platforms. + [Reported by Aaron Reitz] + +Version 0.5.1 2006-apr-30 +------------- +++ Implemented bit depth reduction for palette images. + * Upgraded libpng to version 1.2.10-optipng. + + Improved the BMP support. + + Added a Unix man page. + [Contributed by Nelson A. de Oliveira] + + Allowed abbreviation of command-line options. + + Changed the option -log to accept a file name as an argument. + * Renamed the option -no to -simulate. + ! Fixed an error in handling .bak files on Unix. + [Reported by Adam Szojda and Nelson A. de Oliveira] + ! Fixed a small typo in the help screen. + [Reported by A. Costa and Nelson A. de Oliveira] + +Version 0.5 2006-jan-14 +----------- +++ Added pngxtern, a libpng add-on for external image format + support: BMP (uncompressed), GIF, PNM. +++ Implemented RGB(A)-to-palette reductions. + * Upgraded zlib to version 1.2.3-optipng. + * Upgraded libpng to version 1.2.8-optipng. + + If trials are ended prematurely, detailed progression is only + reported under the option -v. + - Removed reporting of some IDAT sizes that exceeded the optimum. + (This was NOT a bug, but a "feature" that confused some users.) + ! Fixed an RGB-to-gray reduction problem that occurred under some + specific background colors. + * Added support for builds based on the system-supplied zlib. + [Requested by Nelson A. de Oliveira] + * Modified LICENSE. It is now a verbatim spell of the zlib license. + +Version 0.4.8 2005-may-10 +------------- + * Upgraded libpng to version 1.0.18-optipng. +!! Fixed a palette-to-gray reduction problem that occurred when an + RGB triple had both an alpha below max, and an alpha equal to max. + [Reported by Nicolas Le Gland] + + Packed the Windows executable using UPX. + +Version 0.4.7 2004-oct-30 +------------- +!! Fixed a palette-to-gray reduction problem that occurred when + having more than one alpha value per RGB triple. + [Reported by Larry Hastings] + ! Fixed the progress display, when processing very large images. + + Displayed the image info at the beginning of processing. +++ Reduced the IDAT buffer size, allowing abandoned trials to + terminate earlier in some circumstances. + + Implemented error recovery, when PLTE is too small, and/or + tRNS is too large. + +Version 0.4.6 2004-oct-25 +------------- + * Upgraded zlib to version 1.2.2-optipng. + * Upgraded libpng to version 1.0.17-optipng. + This provides safe handling of some ill-formed PNG images. + + Rewrote makefiles. + + Added project workspace to build under Visual C++ 6.0, + integrated with memory leak detection. +++ Implemented a premature termination of trials, in the moment + when IDAT grows beyond the smallest size previously achieved. + [Requested by Larry Hastings] + + Changed the order of trials, to perform the trials that are + more likely to yield a smaller IDAT, at the beginning. + + Added the option -full to avoid the premature termination of + trials; useful for debugging. + +Version 0.4.5 2004-may-31 +------------- + * Upgraded zlib to version 1.2.1.f-cos2. + * Upgraded libpng to version 1.0.15-cos2. + * Renamed the option -nx to -nz. + + Added the option -preserve to preserve file attributes + (file mode, time stamp, etc.) where applicable. + [Requested by Nehal Mistry] + ! Fixed an incorrect initialization of zlib window bits. + ! Displayed an error message when the search space was invalid. +!! Fixed a palette reduction problem for bit depths below 8. + ! Eliminated memory leaks. + [Contributed by Niels de Koning] + +Version 0.4.4 2003-nov-20 +------------- + * Upgraded zlib to version 1.2.1. +++ Added support for the Z_RLE strategy. + +Version 0.4.3 2003-aug-12 +------------- + ! Fixed a reduction problem that caused an assertion failure. + [Reported by Dimitri Papadopoulos] + +Version 0.4.2 2003-jun-30 +------------- +++ Enhanced the support for palette size reductions: + trailing sterile palette entries are removed even when + the bit depth is below 8. + ! Enforced recompression when the new IDAT has the same size, + but other chunks have been reduced. + + Displayed the IDAT size difference as a percentage. + [Requested by Nehal Mistry] + +Version 0.4.1 2003-may-19 +------------- + ! Fixed the removal of trailing sterile palette entries. + +Version 0.4 2003-may-12 +----------- +++ Added support for palette-to-gray reductions. +++ Added partial support for palette size reductions. + ! Fixed the reporting of invalid command-line options. + ! Eliminated a spurious warning when the zlib window size + is set to 256. + +Version 0.3.2 2003-mar-11 +------------- + + Added support for updating sBIT during reductions. + ! Fixed the reduction of the alpha channel. + +Version 0.3.1 2003-feb-25 +------------- + ! Fixed the encoding of interlaced images when they become + larger than the input. + [Reported by James H. Cloos, Jr.] + + Added the HISTORY document (this file). + +Version 0.3 2003-feb-24 +----------- + * Announced the first public release of OptiPNG. +++ Added support for iterating through zlib memory levels. +++ Added support for collapsing IDAT, avoiding calls to + png_set_compression_buffer_size(). + This reduces the memory requirements. +++ Added support for lossless reduction of the image type: + RGB[A] -> G[A], RGBA -> RGB, GA -> G + + Added many user options. + + Added documentation. + +Version 0.2 2001-dec-27 +----------- + + Added support for optimization level presets. + + Added a user option for changing the interlacing. + +Version 0.1 2001-dec-17 +----------- + + Added support for chunk I/O status annotation. + This improves the speed of OptiPNG significantly. + * Added structured exception handling via cexcept. + +Version 0.0.1 2001-dec-10 +------------- + * Introduced OptiPNG. +++ Compressed PNG IDAT data repeatedly, iterating through zlib + compression and strategy levels, as well as PNG delta filters. diff --git a/doc/doc/license.txt b/doc/doc/license.txt new file mode 100644 index 00000000000..58fbad30883 --- /dev/null +++ b/doc/doc/license.txt @@ -0,0 +1,21 @@ +Copyright (C) 2001-2023 Cosmin Truta and the Contributing Authors. +For the purpose of copyright and licensing, the list of Contributing +Authors is available in the accompanying AUTHORS file. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the author(s) be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/doc/doc/optipng.man.pdf b/doc/doc/optipng.man.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4f8b7083bf4c48e3a60fb7a118bbf5825f78889b GIT binary patch literal 42393 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 outfile + optipng -stdout infile > outfile + +- Optimization of an entire directory, with and without subdirectory + recursion: + optipng dir/ + optipng -recursive dir/ + +- Support for conversion to a desired bit depth and color type: + optipng -b16 -c6 files ... + +- Support for handling metadata, e.g.: + optipng -set tEXt=, # add or update chunk + optipng -set sRGB=0 # add or update chunk + optipng -set image.precision= # set the precision of all samples + optipng -set image.alpha.precision= # set the precision of alpha samples + optipng -reset image.alpha # make the image fully opaque + optipng -strip hIST,sPLT # strip hIST and sPLT + optipng -strip all -protect iCCP # strip all metadata except iCCP + +- Parallelization on multi-processor/multi-core machines: + optipng -jobs 4 files ... From 16ae891bee28c3b6b55a8d47428e146c9f243a9e Mon Sep 17 00:00:00 2001 From: emma-bailey Date: Tue, 14 Jul 2026 14:47:06 +0200 Subject: [PATCH 03/11] Update test data --- mne/datasets/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mne/datasets/config.py b/mne/datasets/config.py index 0ea542fdca0..92f4c50941e 100644 --- a/mne/datasets/config.py +++ b/mne/datasets/config.py @@ -87,7 +87,7 @@ # update the checksum in the MNE_DATASETS dict below, and change version # here: ↓↓↓↓↓↓↓↓ RELEASES = dict( - testing="0.173", + testing="0.175", misc="0.27", phantom_kit="0.2", ucl_opm_auditory="0.2", @@ -115,7 +115,7 @@ # Testing and misc are at the top as they're updated most often MNE_DATASETS["testing"] = dict( archive_name=f"{TESTING_VERSIONED}.tar.gz", - hash="md5:0973c25cd0e3ca43a75ea6953ace1daa", + hash="md5:0934f219e59aa727988b95352cfc1fcb", url=( "https://codeload.github.com/mne-tools/mne-testing-data/" f"tar.gz/{RELEASES['testing']}" From d9a1baeb6f5713e5425c1e6c800f29d6316f0a73 Mon Sep 17 00:00:00 2001 From: emma-bailey Date: Tue, 14 Jul 2026 14:49:40 +0200 Subject: [PATCH 04/11] Change indexing logic --- mne/io/nirx/nirx.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/mne/io/nirx/nirx.py b/mne/io/nirx/nirx.py index 4ac60ecfe1a..3d6f8a24174 100644 --- a/mne/io/nirx/nirx.py +++ b/mne/io/nirx/nirx.py @@ -119,7 +119,6 @@ def __init__(self, fname, saturated, *, preload=False, encoding=None, verbose=No "description.json", "wl1", "wl2", - "tri", ) else: # NIRScout devices and NIRSport1 devices @@ -382,6 +381,13 @@ def __init__(self, fname, saturated, *, preload=False, encoding=None, verbose=No src_locs = np.array(probes["coords_s3"]) / 1000.0 det_locs = np.array(probes["coords_d3"]) / 1000.0 ch_locs = np.array(probes["coords_c3"]) / 1000.0 + if _probe_json["probeInfo"]["head_circumference"] != 610.0: + warn( + "The head circumference in the probeInfo.json file is " + f"{_probe_json['probeInfo']['head_circumference']} mm, " + "as opposed to standard 610.0 mm. This may cause misalignment of " + "the optode locations with the subject's head in later steps." + ) else: mat_data = loadmat(files["probeInfo"]) probes = mat_data["probeInfo"]["probes"][0, 0] @@ -445,11 +451,11 @@ def __init__(self, fname, saturated, *, preload=False, encoding=None, verbose=No # The detector location is stored in the third 3 entries of loc. # NIRx NIRSite uses MNI coordinates. # Also encode the light frequency in the structure. - for ch_idx2 in range(requested_channels.shape[0]): + for ch_idx2, wl_idx in enumerate(req_ind): # Find source and store location - src = int(requested_channels[ch_idx2, 0]) - 1 + src = int(sources[wl_idx]) - 1 # Find detector and store location - det = int(requested_channels[ch_idx2, 1]) - 1 + det = int(detectors[wl_idx]) - 1 # Store channel location as midpoint between source and detector. midpoint = (src_locs[src, :] + det_locs[det, :]) / 2 for ii in range(2): @@ -528,6 +534,9 @@ def __init__(self, fname, saturated, *, preload=False, encoding=None, verbose=No # Read triggers from event file if not is_aurora: files["tri"] = files["hdr"][:-3] + "evt" + else: + tri_files = glob.glob(f"{fname}/*.tri") + files["tri"] = tri_files[0] if len(tri_files) == 1 else "" if op.isfile(files["tri"]): with _open(files["tri"]) as fid: t = [re.findall(r"(\d+)", line) for line in fid] @@ -617,3 +626,4 @@ def _determine_tri_idxs(trigger): raise RuntimeError("Unable to read trigger file.") return trigger_frame_idx, desc_idx + From d5ec19f95ec6bed268d1adce5730d19bd4b6a597 Mon Sep 17 00:00:00 2001 From: emma-bailey Date: Tue, 14 Jul 2026 15:06:23 +0200 Subject: [PATCH 05/11] Update tested Aurora versions --- mne/io/nirx/nirx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mne/io/nirx/nirx.py b/mne/io/nirx/nirx.py index 3d6f8a24174..d513e2c2a83 100644 --- a/mne/io/nirx/nirx.py +++ b/mne/io/nirx/nirx.py @@ -209,6 +209,7 @@ def __init__(self, fname, saturated, *, preload=False, encoding=None, verbose=No "2021.4.0-34-ge9fdbbc8", "2021.9.0-5-g3eb32851", "2021.9.0-6-g14ef4a71", + "2025.2.0-17-geea6971f" ]: warn( "MNE has not been tested with Aurora version " From 84dfba2d81c66839c85e273bb7775682f2dd0af2 Mon Sep 17 00:00:00 2001 From: emma-bailey Date: Tue, 14 Jul 2026 15:11:12 +0200 Subject: [PATCH 06/11] Test reading updated Aurora output files --- mne/io/nirx/tests/test_nirx.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/mne/io/nirx/tests/test_nirx.py b/mne/io/nirx/tests/test_nirx.py index e9a5a117480..084c1b82a2a 100644 --- a/mne/io/nirx/tests/test_nirx.py +++ b/mne/io/nirx/tests/test_nirx.py @@ -55,6 +55,7 @@ nirsport2 = testing_path / "NIRx" / "nirsport_v2" / "aurora_recording _w_short_and_acc" nirsport2_2021_9 = testing_path / "NIRx" / "nirsport_v2" / "aurora_2021_9" nirsport2_2021_9_6 = testing_path / "NIRx" / "nirsport_v2" / "aurora_2021_9_6" +nirsport2_2025_2 = testing_path / "NIRx" / "nirsport_v2" / "aurora_2025_2" def test_nirsport_v2_matches_snirf(nirx_snirf): @@ -551,6 +552,37 @@ def test_nirx_aurora_2021_9_6(): assert raw.annotations.description[2] == "3.0" +@requires_testing_data +@pytest.mark.filterwarnings("ignore:.*Extraction of measurement.*:") +def test_nirx_aurora_2025_2(): + """Test reading Aurora dataset with probeInfo.json""" + raw = read_raw_nirx(nirsport2_2025_2, preload=True) + + # 50 channels × 2 wavelengths + assert raw._data.shape[0] == 100 + + # Test triggers + assert len(raw.annotations) == 10 + assert (raw.annotations.description == "1.0").sum() == 5 + assert (raw.annotations.description == "2.0").sum() == 5 + + # Test detector locations derived from probeInfo.json (MNI coords in mm) + allowed_dist_error = 0.0002 + locs = [ch["loc"][6:9] for ch in raw.info["chs"]] + head_mri_t, _ = _get_trans("fsaverage", "head", "mri") + mni_locs = apply_trans(head_mri_t, locs) + + assert raw.info["ch_names"][0][3:5] == "D1" + assert_allclose(mni_locs[0], [-0.035971, 0.027644, 0.077821], atol=allowed_dist_error) + + # Test source locations + locs = [ch["loc"][3:6] for ch in raw.info["chs"]] + mni_locs = apply_trans(head_mri_t, locs) + + assert raw.info["ch_names"][0][:2] == "S1" + assert_allclose(mni_locs[0], [-0.02948, 0.060438, 0.057351], atol=allowed_dist_error) + + @requires_testing_data def test_nirx_15_0(): """Test reading NIRX files.""" From eba7436a208debac77ceecba33e5508dab50f9dc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 13:29:31 +0000 Subject: [PATCH 07/11] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mne/io/nirx/nirx.py | 3 +-- mne/io/nirx/tests/test_nirx.py | 8 ++++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mne/io/nirx/nirx.py b/mne/io/nirx/nirx.py index d513e2c2a83..dd3a909ba53 100644 --- a/mne/io/nirx/nirx.py +++ b/mne/io/nirx/nirx.py @@ -209,7 +209,7 @@ def __init__(self, fname, saturated, *, preload=False, encoding=None, verbose=No "2021.4.0-34-ge9fdbbc8", "2021.9.0-5-g3eb32851", "2021.9.0-6-g14ef4a71", - "2025.2.0-17-geea6971f" + "2025.2.0-17-geea6971f", ]: warn( "MNE has not been tested with Aurora version " @@ -627,4 +627,3 @@ def _determine_tri_idxs(trigger): raise RuntimeError("Unable to read trigger file.") return trigger_frame_idx, desc_idx - diff --git a/mne/io/nirx/tests/test_nirx.py b/mne/io/nirx/tests/test_nirx.py index 084c1b82a2a..e1dd3d22fb4 100644 --- a/mne/io/nirx/tests/test_nirx.py +++ b/mne/io/nirx/tests/test_nirx.py @@ -573,14 +573,18 @@ def test_nirx_aurora_2025_2(): mni_locs = apply_trans(head_mri_t, locs) assert raw.info["ch_names"][0][3:5] == "D1" - assert_allclose(mni_locs[0], [-0.035971, 0.027644, 0.077821], atol=allowed_dist_error) + assert_allclose( + mni_locs[0], [-0.035971, 0.027644, 0.077821], atol=allowed_dist_error + ) # Test source locations locs = [ch["loc"][3:6] for ch in raw.info["chs"]] mni_locs = apply_trans(head_mri_t, locs) assert raw.info["ch_names"][0][:2] == "S1" - assert_allclose(mni_locs[0], [-0.02948, 0.060438, 0.057351], atol=allowed_dist_error) + assert_allclose( + mni_locs[0], [-0.02948, 0.060438, 0.057351], atol=allowed_dist_error + ) @requires_testing_data From 0cdc7809ae9a47880445b097f60ea31e20020a1d Mon Sep 17 00:00:00 2001 From: emma-bailey Date: Wed, 15 Jul 2026 11:41:52 +0200 Subject: [PATCH 08/11] Update author details --- doc/changes/names.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/changes/names.inc b/doc/changes/names.inc index 9c337b3d5c1..114cfb6999e 100644 --- a/doc/changes/names.inc +++ b/doc/changes/names.inc @@ -90,7 +90,7 @@ .. _Eberhard Eich: https://github.com/ebeich .. _Eduard Ort: https://github.com/eort .. _Emily Stephen: https://github.com/emilyps14 -.. _Emma Bailey: https://www.cbs.mpg.de/employees/bailey +.. _Emma Bailey: https://github.com/emma-bailey .. _Emma Zhang: https://portfolio-production-ed03.up.railway.app/ .. _Emmanuel Ferdman: https://github.com/emmanuel-ferdman .. _Emrecan Çelik: https://github.com/emrecncelik From 16e94254ba25e48e56802c642b1bca6359b0e671 Mon Sep 17 00:00:00 2001 From: emma-bailey Date: Wed, 15 Jul 2026 14:25:05 +0200 Subject: [PATCH 09/11] Remove OptiPNG related files --- doc/OptiPNG.url | 2 - doc/doc/authors.txt | 31 --- doc/doc/history.txt | 435 ---------------------------------------- doc/doc/license.txt | 21 -- doc/doc/optipng.man.pdf | Bin 42393 -> 0 bytes doc/doc/optipng.man.txt | 299 --------------------------- doc/doc/todo.txt | 42 ---- 7 files changed, 830 deletions(-) delete mode 100644 doc/OptiPNG.url delete mode 100644 doc/doc/authors.txt delete mode 100644 doc/doc/history.txt delete mode 100644 doc/doc/license.txt delete mode 100644 doc/doc/optipng.man.pdf delete mode 100644 doc/doc/optipng.man.txt delete mode 100644 doc/doc/todo.txt diff --git a/doc/OptiPNG.url b/doc/OptiPNG.url deleted file mode 100644 index 9796437165b..00000000000 --- a/doc/OptiPNG.url +++ /dev/null @@ -1,2 +0,0 @@ -[InternetShortcut] -URL=http://optipng.sourceforge.net/ diff --git a/doc/doc/authors.txt b/doc/doc/authors.txt deleted file mode 100644 index 0245e5ab1be..00000000000 --- a/doc/doc/authors.txt +++ /dev/null @@ -1,31 +0,0 @@ -# OptiPNG version 0.7.8 -# Copyright (C) 2001-2023 Cosmin Truta and the Contributing Authors. -# See the accompanying LICENSE file for details. -# -# A Contributing Author is a person or company who contributed code that -# is now part of OptiPNG. -# -# For the purpose of copyright and licensing, this is the official list -# of Contributing Authors, in alphabetic order. - -Adam Ciarcinski -Brian McQuade -Elias Pipping -Fabien Barbier -Friedrich Preuss -Maciej Pilichowski -Matthew Fearnley -Nelson A. de Oliveira -Niels de Koning -Oliver Schneider -Petr Gajdos -Piotr Bandurski -Priit Laes -Ramona C. Truta -Sebastian Pipping -Stefan Brüns -Thomas Hurst -Till Maas -Ville Skyttä -Vincent Lefèvre -Yuen Ho Wong diff --git a/doc/doc/history.txt b/doc/doc/history.txt deleted file mode 100644 index ccd3746dc2e..00000000000 --- a/doc/doc/history.txt +++ /dev/null @@ -1,435 +0,0 @@ -OptiPNG - Revision history -========================== - -Legend ------- -++ Added or improved performance-related feature - (might improve compression ratio or processing speed). - + Added or improved feature. - - Removed feature. - ! Fixed bug. -!! Fixed critical bug - (crash, data/metadata loss or security hazard). - * Other modification (e.g. architectural improvement). - -Version 0.7.8 2023-nov-03 -------------- - * Upgraded libpng to version 1.6.40. - * Upgraded zlib to version 1.3-optipng. - * Upgraded cexcept to version 2.0.2-optipng. -!! Fixed a global-buffer-overflow vulnerability in the GIF reader. - [Reported by Zeng Yunxiang; fixed by Thomas Hurst] - ! Fixed a stack-print-after-scope defect in the error handler. - ! Fixed an assertion failure in the image reduction module. - ! Fixed the command-line wildargs expansion in the Windows port. - * Raised the minimum required libpng version from 1.2.9 to 1.6.35. - * Raised the minimum required zlib version from 1.2.1 to 1.2.8. - * Refactored the structured exception handling. - -Version 0.7.7 2017-dec-27 -------------- - * Upgraded libpng to version 1.6.34. - * Upgraded zlib to version 1.2.11-optipng. - * Upgraded minitiff to version 0.2. -!! Fixed a buffer overflow vulnerability in the GIF decoder. - [Reported by Joonun Jang] -!! Fixed an integer overflow vulnerability in the TIFF decoder. - [Reported by Jaeseung Choi] - ! Fixed the build on macOS High Sierra. - [Reported by various users] - [Fixed by Yuen Ho Wong and Friedrich Preuss] - ! Fixed the build on DJGPP. - * Disallowed out-of-bounds values in rangeset options. - -Version 0.7.6 2016-apr-03 [Released by Ramona C. Truta] -------------- - * Upgraded libpng to version 1.6.21. - ! Fixed an assertion failure in the image reduction code. - [Fixed by upgrading libpng] -!! Fixed various security-sensitive defects in the BMP decoder. - [Reported by Henri Salo and Hans Jerry Illikainen] - [Fixed by Ramona C. Truta] - ! Fixed a benign uninitialized memory read in the GIF decoder. - [Reported by Gustavo Grieco] - ! Fixed a build failure occurring under the Estonian (et_EE) locale. - [Reported by Sebastian Pipping] - [Fixed by Priit Laes] - ! Fixed a build failure occurring on Mac OS X, FreeBSD, and possibly - other systems that lack POSIX-compliant high-resolution timestamps. - [Reported by Ryan Schmidt and Dmitry Egorov] - [Contributed by Sebastian Pipping] - ! Fixed a typo causing build failures in 32-bit ANSI C compilation. - [Reported by various users] - -Version 0.7.5 2014-mar-24 -------------- - * Upgraded libpng to version 1.6.10-optipng. - * Upgraded zlib to version 1.2.8-optipng. - ! Fixed various build issues with libpng-1.5 and libpng-1.6. - [Fixed by Oliver Schneider] - * Allowed the handling of huge image files (> millions of pixels - per row or column) to be independent of the libpng version. - + Allowed the option -preserve to save the file ownership (UID/GID) - on Unix. - [Requested by Otto Kekäläinen] - ! Fixed a build issue with Clang. - + Added various enhancements to the configure script. - -Version 0.7.4 2012-oct-21 -------------- -!! Fixed the previous fix, which failed to fix the option -fix. - [Reported by Gynvael Coldwind and Mateusz Jurczyk] - -Version 0.7.3 2012-sep-16 -------------- -!! Fixed a use-after-free vulnerability in the palette reduction code. - This vulnerability was accidentally introduced in version 0.7. - -Version 0.7.2 2012-aug-24 -------------- - * Upgraded libpng to version 1.4.12. - * Upgraded zlib to version 1.2.7-optipng. - ! Fixed the display of huge (4GB+) file/IDAT sizes on 32-bit platforms. - ! Issued a proper error message if the output IDAT can't fit in 2GB. - Acknowledged this limitation in the user manual. - [Reported by John Sauter] - ! Fixed the output file cleanup that should occur after a write error. - * Added the option -debug and various undocumented debug features. - * Moved the PNG reduction module (opngreduc) to a separate sub-project. - -Version 0.7.1 2012-mar-19 [Released by Ramona C. Truta] -------------- -!! Fixed a regression in the reduction of palette-encoded grayscale - images. (This regression was introduced in version 0.7.) - [Fixed by Adam Ciarcinski] - -Version 0.7 2012-feb-29 [Released by Cosmin & Ramona C. Truta] ------------ - * Upgraded libpng to version 1.4.9. - * Upgraded zlib to version 1.2.6-optipng. -!! Fixed a rarely-occurring out-of-bounds memory access error in - the Z_RLE strategy in zlib. - [Reported by Christopher Wichura] - [Fixed by upgrading zlib] - + Added the popularly-requested option -strip. - The only suboption currently supported is "-strip all". - + Added the option -clobber. - [Contributed by Maciej Pilichowski] - + Added the option -backup, as an alias of -keep. - [Contributed by Ramona C. Truta] - + Added the option -silent, as an alias of -quiet. - [Contributed by Ramona C. Truta] - - Deprecated the option -log. - [Contributed by Ramona C. Truta] - * Changed the activity display output from STDOUT to STDERR. - + Allowed the option -preserve to save high-resolution timestamps - on Unix, if the POSIX-1.2008 API is available. - (This feature was previously available on Windows only.) - ! Fixed a minor precision error in the display of file size percents. - ! Fixed a memory leak that occurred when reading broken GIF images. - ! Fixed various build issues. - [Fixed by Sebastian Pipping and Ville Skyttä] - * Resolved all remaining compatibility issues with libpng-1.5. - [Contributed by Adam Ciarcinski] - * Added build support for clang. - * Reorganized the source directory structure. - -Version 0.6.5 2011-jan-24 -------------- - * Upgraded libpng to version 1.4.5-optipng. - * Upgraded zlib to version 1.2.5-optipng. -!! Fixed the I/O states (in libpng 1.4.5); - they caused incorrect file reads in some rare cases. - [Reported by Dmitry Marakasov] -!! Fixed processing of PNG files with chunks of size 0. - [Reported by Matthew Fearnley] - ! Fixed a display error in the TIFF import. - [Fixed by Piotr Bandurski] - + Improved checking of the arguments of -f, -zc, -zm and -zs. - - Removed quirks from the rangeset option argument syntax. - ! Fixed a build issue under the system-supplied libpng-1.4. - [Fixed by Petr Gajdos] - * Resolved forward-compatibility issues regarding libpng-1.5; - however, the system-supplied libpng-1.5 is not yet supported. - * Added various enhancements to the configure+make build system. - [Contributed by Elias Pipping and Dmitri Zubko] - -Version 0.6.4 2010-mar-14 -------------- - * Upgraded libpng to version 1.4.1-optipng. - * Upgraded zlib to version 1.2.4-optipng. - + Added the option -nx. - * Clarified the behavior of the option -nz and the relationship between - the options -nz and -o0. - + Added a filesystem check (resolving normalized paths, symlinks, etc.) - to better detect when the output overwrites the input. - + Enabled automatic wildcard expansion (i.e. globbing) on Win64. - ! Fixed a Unicode build issue on Windows. - [Fixed by Fabien Barbier] - -Version 0.6.3 2009-may-18 -------------- - * Upgraded libpng to version 1.2.36-optipng. -!! Fixed a use-after-free error in the GIF reader. - [Reported by Roy Tam] - [Fixed by Bryan McQuade] - ! Flushed the output log to display the current trial in real time. - This only worked on Windows in the previous version. - [Fixed by Vincent Lefèvre] - ! Fixed an error in reporting unrecognized file formats. - - Removed the requirement to "fix" TIFF files that contain unrecognized - metadata. - [Requested by Piotr Bandurski] - * Simplified the option abbreviation rules. Option names can now be - abbreviated to their shortest unique prefix, as in X11 applications. - -Version 0.6.2 2008-nov-09 -------------- - * Upgraded libpng to version 1.2.33-optipng. -++ Put back a speed optimization, accidentally removed in version 0.6, - allowing singleton trials (-o1) to be bypassed in certain conditions. -!! Fixed an array overflow in the BMP reader. -!! Fixed the loss of private chunks under the option -snip. - + Produced a more concise on-screen output in the non-verbose mode. - [Contributed by Vincent Lefèvre] - * Added a programming interface to the optimization engine, in order - to facilitate the development of PNG-optimizing GUI apps and plugins. - -Version 0.6.1 2008-jul-20 -------------- - * Upgraded cexcept to version 2.0.1. - + Added a configure script, to be used instead of unix-secure.mak. - ! Fixed a build issue that occurred when using libpng from the system. - [Reported by Nelson A. de Oliveira] - ! Fixed the processing when the image reduction yields an output larger - than the original. - [Reported by Michael Krishtopa] - ! Fixed the behavior of the option -preserve. - [Reported by Bill Koch] - - Removed displaying of partial progress when abandoning IDATs under - the option -v. (The percentages displayed were not very accurate.) - -Version 0.6 2008-jun-15 ------------ - * Upgraded libpng to version 1.2.29-optipng. -++ Implemented grayscale(alpha)-to-palette reductions. -++ Improved conversion of bKGD info during RGB-to-palette reductions. - [Contributed by Matthew Fearnley] -!! Fixed conversion of bKGD and tRNS during 16-to-8-bit reductions. - [Reported by Matthew Fearnley] - + Added support for compressed BMP (incl. PNG-compressed BMP, you bet!) - + Improved the speed of reading raw PNM files. - + Recognized PNG digital signatures (dSIG) and disabled optimization - in their presence, to preserve their integrity. - + Allowed the user to enforce the optimization of dSIG'ed files. - + Recognized APNG animation files and disabled reductions to preserve - their integrity. - + Added the option -snip, to allow the user to snip one image out of - a multi-image file, such as animated GIF, multi-page TIFF, or APNG. - + Improved recovery of PNG files with incomplete IDAT. -!! Fixed a crash triggered by the use of -log on some platforms. - [Fixed by Stefan Brüns] - ! Fixed the behavior of the options -out and -dir when the input is - already optimized. - [Reported by Christian Davideck] - * Provided more detailed image information at the start of processing. - * Provided a more detailed summary at the end of processing, under the - presence of the option -v and/or the occurrence of exceptional events. - -Version 0.5.5 2007-jan-28 -------------- - * Upgraded libpng to version 1.2.15-optipng. -++ Used a previously-missed RGB-to-palette reduction opportunity - for images containing 256 distinct colors. - [Reported by Joachim Kluge] -!! Fixed conversion of bKGD info during RGB-to-palette reductions. - [Reported by Matthew Fearnley] - ! Fixed pre-computation of iterations. - [Reported by Matthew Fearnley] - ! Eliminated a false alarm when processing RGB images with tRNS - in Unix-secure mode. - [Reported by Till Maas] - [Fixed by Nelson A. de Oliveira] - ! Fixed the behavior of the options -out and -dir when changing - interlacing. - [Reported by Martin Packman] - ! Fixed the behavior of "-dir [DRIVE]:" on Windows. - -Version 0.5.4 2006-aug-11 -------------- - + Added the options -out and -dir, to specify the name of the - output file or directory. - [Requested by Alexander Lucas] - * Added support for builds based on the system-supplied libpng. - [Contributed by Nelson A. de Oliveira] - -Version 0.5.3 2006-jul-23 -------------- - * Upgraded libpng to version 1.2.12-optipng. - + Implemented basic support for TIFF (grayscale, RGB and RGBA, - uncompressed). -++ Avoided the redundant trial when the search space is singular - (e.g. when running "optipng -o1 example.tif"). - + Prevented accidental file corruption when using the option -log. - ! Fixed (again) a small typo in the online help. - -Version 0.5.2 2006-may-07 -------------- - + Improved handling of inexact PNM-to-PNG conversions. - ! Fixed a typo that was breaking the build on some Unix platforms. - [Reported by Aaron Reitz] - -Version 0.5.1 2006-apr-30 -------------- -++ Implemented bit depth reduction for palette images. - * Upgraded libpng to version 1.2.10-optipng. - + Improved the BMP support. - + Added a Unix man page. - [Contributed by Nelson A. de Oliveira] - + Allowed abbreviation of command-line options. - + Changed the option -log to accept a file name as an argument. - * Renamed the option -no to -simulate. - ! Fixed an error in handling .bak files on Unix. - [Reported by Adam Szojda and Nelson A. de Oliveira] - ! Fixed a small typo in the help screen. - [Reported by A. Costa and Nelson A. de Oliveira] - -Version 0.5 2006-jan-14 ------------ -++ Added pngxtern, a libpng add-on for external image format - support: BMP (uncompressed), GIF, PNM. -++ Implemented RGB(A)-to-palette reductions. - * Upgraded zlib to version 1.2.3-optipng. - * Upgraded libpng to version 1.2.8-optipng. - + If trials are ended prematurely, detailed progression is only - reported under the option -v. - - Removed reporting of some IDAT sizes that exceeded the optimum. - (This was NOT a bug, but a "feature" that confused some users.) - ! Fixed an RGB-to-gray reduction problem that occurred under some - specific background colors. - * Added support for builds based on the system-supplied zlib. - [Requested by Nelson A. de Oliveira] - * Modified LICENSE. It is now a verbatim spell of the zlib license. - -Version 0.4.8 2005-may-10 -------------- - * Upgraded libpng to version 1.0.18-optipng. -!! Fixed a palette-to-gray reduction problem that occurred when an - RGB triple had both an alpha below max, and an alpha equal to max. - [Reported by Nicolas Le Gland] - + Packed the Windows executable using UPX. - -Version 0.4.7 2004-oct-30 -------------- -!! Fixed a palette-to-gray reduction problem that occurred when - having more than one alpha value per RGB triple. - [Reported by Larry Hastings] - ! Fixed the progress display, when processing very large images. - + Displayed the image info at the beginning of processing. -++ Reduced the IDAT buffer size, allowing abandoned trials to - terminate earlier in some circumstances. - + Implemented error recovery, when PLTE is too small, and/or - tRNS is too large. - -Version 0.4.6 2004-oct-25 -------------- - * Upgraded zlib to version 1.2.2-optipng. - * Upgraded libpng to version 1.0.17-optipng. - This provides safe handling of some ill-formed PNG images. - + Rewrote makefiles. - + Added project workspace to build under Visual C++ 6.0, - integrated with memory leak detection. -++ Implemented a premature termination of trials, in the moment - when IDAT grows beyond the smallest size previously achieved. - [Requested by Larry Hastings] - + Changed the order of trials, to perform the trials that are - more likely to yield a smaller IDAT, at the beginning. - + Added the option -full to avoid the premature termination of - trials; useful for debugging. - -Version 0.4.5 2004-may-31 -------------- - * Upgraded zlib to version 1.2.1.f-cos2. - * Upgraded libpng to version 1.0.15-cos2. - * Renamed the option -nx to -nz. - + Added the option -preserve to preserve file attributes - (file mode, time stamp, etc.) where applicable. - [Requested by Nehal Mistry] - ! Fixed an incorrect initialization of zlib window bits. - ! Displayed an error message when the search space was invalid. -!! Fixed a palette reduction problem for bit depths below 8. - ! Eliminated memory leaks. - [Contributed by Niels de Koning] - -Version 0.4.4 2003-nov-20 -------------- - * Upgraded zlib to version 1.2.1. -++ Added support for the Z_RLE strategy. - -Version 0.4.3 2003-aug-12 -------------- - ! Fixed a reduction problem that caused an assertion failure. - [Reported by Dimitri Papadopoulos] - -Version 0.4.2 2003-jun-30 -------------- -++ Enhanced the support for palette size reductions: - trailing sterile palette entries are removed even when - the bit depth is below 8. - ! Enforced recompression when the new IDAT has the same size, - but other chunks have been reduced. - + Displayed the IDAT size difference as a percentage. - [Requested by Nehal Mistry] - -Version 0.4.1 2003-may-19 -------------- - ! Fixed the removal of trailing sterile palette entries. - -Version 0.4 2003-may-12 ------------ -++ Added support for palette-to-gray reductions. -++ Added partial support for palette size reductions. - ! Fixed the reporting of invalid command-line options. - ! Eliminated a spurious warning when the zlib window size - is set to 256. - -Version 0.3.2 2003-mar-11 -------------- - + Added support for updating sBIT during reductions. - ! Fixed the reduction of the alpha channel. - -Version 0.3.1 2003-feb-25 -------------- - ! Fixed the encoding of interlaced images when they become - larger than the input. - [Reported by James H. Cloos, Jr.] - + Added the HISTORY document (this file). - -Version 0.3 2003-feb-24 ------------ - * Announced the first public release of OptiPNG. -++ Added support for iterating through zlib memory levels. -++ Added support for collapsing IDAT, avoiding calls to - png_set_compression_buffer_size(). - This reduces the memory requirements. -++ Added support for lossless reduction of the image type: - RGB[A] -> G[A], RGBA -> RGB, GA -> G - + Added many user options. - + Added documentation. - -Version 0.2 2001-dec-27 ------------ - + Added support for optimization level presets. - + Added a user option for changing the interlacing. - -Version 0.1 2001-dec-17 ------------ - + Added support for chunk I/O status annotation. - This improves the speed of OptiPNG significantly. - * Added structured exception handling via cexcept. - -Version 0.0.1 2001-dec-10 -------------- - * Introduced OptiPNG. -++ Compressed PNG IDAT data repeatedly, iterating through zlib - compression and strategy levels, as well as PNG delta filters. diff --git a/doc/doc/license.txt b/doc/doc/license.txt deleted file mode 100644 index 58fbad30883..00000000000 --- a/doc/doc/license.txt +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (C) 2001-2023 Cosmin Truta and the Contributing Authors. -For the purpose of copyright and licensing, the list of Contributing -Authors is available in the accompanying AUTHORS file. - -This software is provided 'as-is', without any express or implied -warranty. In no event will the author(s) be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must not - be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. diff --git a/doc/doc/optipng.man.pdf b/doc/doc/optipng.man.pdf deleted file mode 100644 index 4f8b7083bf4c48e3a60fb7a118bbf5825f78889b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42393 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 outfile - optipng -stdout infile > outfile - -- Optimization of an entire directory, with and without subdirectory - recursion: - optipng dir/ - optipng -recursive dir/ - -- Support for conversion to a desired bit depth and color type: - optipng -b16 -c6 files ... - -- Support for handling metadata, e.g.: - optipng -set tEXt=, # add or update chunk - optipng -set sRGB=0 # add or update chunk - optipng -set image.precision= # set the precision of all samples - optipng -set image.alpha.precision= # set the precision of alpha samples - optipng -reset image.alpha # make the image fully opaque - optipng -strip hIST,sPLT # strip hIST and sPLT - optipng -strip all -protect iCCP # strip all metadata except iCCP - -- Parallelization on multi-processor/multi-core machines: - optipng -jobs 4 files ... From 06b8171609fc2a38dc2bc7b90e58f6c0e23678d7 Mon Sep 17 00:00:00 2001 From: emma-bailey Date: Thu, 16 Jul 2026 10:54:28 +0200 Subject: [PATCH 10/11] Update style --- mne/io/nirx/tests/test_nirx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mne/io/nirx/tests/test_nirx.py b/mne/io/nirx/tests/test_nirx.py index e1dd3d22fb4..3ba2a925139 100644 --- a/mne/io/nirx/tests/test_nirx.py +++ b/mne/io/nirx/tests/test_nirx.py @@ -555,7 +555,7 @@ def test_nirx_aurora_2021_9_6(): @requires_testing_data @pytest.mark.filterwarnings("ignore:.*Extraction of measurement.*:") def test_nirx_aurora_2025_2(): - """Test reading Aurora dataset with probeInfo.json""" + """Test reading Aurora dataset with probeInfo.json.""" raw = read_raw_nirx(nirsport2_2025_2, preload=True) # 50 channels × 2 wavelengths From a544c6d73f41ba8312fd6efeaed4e793b8b36415 Mon Sep 17 00:00:00 2001 From: emma-bailey Date: Thu, 16 Jul 2026 10:55:09 +0200 Subject: [PATCH 11/11] New feature description --- doc/changes/dev/14055.newfeature.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changes/dev/14055.newfeature.rst diff --git a/doc/changes/dev/14055.newfeature.rst b/doc/changes/dev/14055.newfeature.rst new file mode 100644 index 00000000000..6d6ad2e9eec --- /dev/null +++ b/doc/changes/dev/14055.newfeature.rst @@ -0,0 +1 @@ +Added support for newer recording software in :func:`mne.io.read_raw_nirx`, by `Emma Bailey`_. \ No newline at end of file