diff --git a/.github/workflows/oxipng.yml b/.github/workflows/oxipng.yml index 4dc8d129..b4429a74 100644 --- a/.github/workflows/oxipng.yml +++ b/.github/workflows/oxipng.yml @@ -19,7 +19,7 @@ jobs: - x86_64-apple-darwin toolchain: # Minimum stable - - "1.56.0" + - "1.57.0" - stable - beta - nightly diff --git a/Cargo.lock b/Cargo.lock index 3c9e8824..d957e979 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -45,9 +45,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bytemuck" -version = "1.8.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e851ca7c24871e7336801608a4797d7376545b6928a10d32d75685687141ead" +checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da" [[package]] name = "byteorder" @@ -67,34 +67,30 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chrono" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" -dependencies = [ - "libc", - "num-integer", - "num-traits", - "time", - "winapi", -] - [[package]] name = "clap" -version = "3.1.6" +version = "3.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8c93436c21e4698bacadf42917db28b23017027a4deccb35dbe47a7e7840123" +checksum = "29e724a68d9319343bb3328c9cc2dfde263f4b3142ee1059a9980580171c954b" dependencies = [ "atty", "bitflags", + "clap_lex", "indexmap", - "os_str_bytes", "strsim", "termcolor", "textwrap", ] +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "cloudflare-zlib" version = "0.2.9" @@ -121,18 +117,18 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "crc" -version = "2.1.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" +checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "1.1.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" +checksum = "2d0165d2900ae6778e36e80bbc4da3b5eefccee9ba939761f9c2882a5d9af3ff" [[package]] name = "crc32fast" @@ -145,9 +141,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.2" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ "cfg-if", "crossbeam-utils", @@ -155,9 +151,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -166,53 +162,53 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.7" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00d6d2ea26e8b151d99093005cb442fb9a37aeaca582a03ec70946f49ab5ed9" +checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" dependencies = [ + "autocfg", "cfg-if", "crossbeam-utils", - "lazy_static", "memoffset", + "once_cell", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.7" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" +checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" dependencies = [ "cfg-if", - "lazy_static", + "once_cell", ] [[package]] name = "deflate" -version = "0.8.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +checksum = "c86f7e25f518f4b81808a2cf1c50996a61f5c2eb394b2393bd87f2a4780a432f" dependencies = [ "adler32", - "byteorder", ] [[package]] name = "either" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c" dependencies = [ "cfg-if", "libc", "redox_syscall", - "winapi", + "windows-sys", ] [[package]] @@ -223,9 +219,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hermit-abi" @@ -238,14 +234,13 @@ dependencies = [ [[package]] name = "image" -version = "0.23.14" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" +checksum = "7e30ca2ecf7666107ff827a8e481de6a132a9b687ed3bb20bb1c144a36c00964" dependencies = [ "bytemuck", "byteorder", "color_quant", - "num-iter", "num-rational", "num-traits", "png", @@ -253,15 +248,21 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.8.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", "hashbrown", "rayon", ] +[[package]] +name = "iter-read" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c397ca3ea05ad509c4ec451fea28b4771236a376ca1c69fd5143aae0cf8f93c4" + [[package]] name = "itertools" version = "0.10.3" @@ -271,51 +272,39 @@ dependencies = [ "either", ] -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - [[package]] name = "libc" -version = "0.2.119" +version = "0.2.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" [[package]] name = "libdeflate-sys" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216b62f1994d8186da0187ad3f925ba267ad44ae67761c7285577583b85b5c6d" +checksum = "43afa5b192ff058426ba20a4f35c290ef402478d6045ac934ac15aa947a3898d" dependencies = [ "cc", ] [[package]] name = "libdeflater" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f0d7ed8d8b1ce10f1613316c83ce236641c2860c0a2ad700b31e1685e76c4f" +checksum = "e656b7960ec49e864badc7ad1b810427a7ac8b78511a699ce5cdc3ead0b32e5b" dependencies = [ "libdeflate-sys", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] -[[package]] -name = "memchr" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" - [[package]] name = "memoffset" version = "0.6.5" @@ -327,48 +316,28 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" -dependencies = [ - "adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" dependencies = [ "adler", ] [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", ] -[[package]] -name = "num-iter" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-rational" -version = "0.3.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", "num-integer", @@ -377,9 +346,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] @@ -396,25 +365,21 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" +checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" [[package]] name = "os_str_bytes" -version = "6.0.0" +version = "6.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" -dependencies = [ - "memchr", -] +checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" [[package]] name = "oxipng" version = "5.0.1" dependencies = [ "bit-vec", - "byteorder", "clap", "cloudflare-zlib", "crc", @@ -425,7 +390,7 @@ dependencies = [ "itertools", "libdeflater", "log", - "miniz_oxide 0.5.1", + "miniz_oxide", "rayon", "rgb", "rustc_version", @@ -436,21 +401,21 @@ dependencies = [ [[package]] name = "png" -version = "0.16.8" +version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba" dependencies = [ "bitflags", "crc32fast", "deflate", - "miniz_oxide 0.3.7", + "miniz_oxide", ] [[package]] name = "rayon" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ "autocfg", "crossbeam-deque", @@ -460,31 +425,30 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" dependencies = [ "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "lazy_static", "num_cpus", ] [[package]] name = "redox_syscall" -version = "0.2.11" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] [[package]] name = "rgb" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e74fdc210d8f24a7dbfedc13b04ba5764f5232754ccebfdf5fff1bad791ccbc6" +checksum = "c3b221de559e4a29df3b957eec92bc0de6bc8eaf6ca9cfed43e5e1d67ff65a34" dependencies = [ "bytemuck", ] @@ -506,18 +470,17 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "semver" -version = "1.0.6" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d" +checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711" [[package]] name = "stderrlog" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b81364c25bf70a0f9beae4ae704d466bf37e704e887ebac89eb9a28d01d491f" +checksum = "af95cb8a5f79db5b2af2a46f44da7594b5adbcbb65cbf87b8da0959bfdd82460" dependencies = [ "atty", - "chrono", "log", "termcolor", "thread_local", @@ -553,34 +516,17 @@ dependencies = [ "once_cell", ] -[[package]] -name = "time" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" -dependencies = [ - "libc", - "wasi", - "winapi", -] - [[package]] name = "typed-arena" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae" -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wild" -version = "2.0.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "035793abb854745033f01a07647a79831eba29ec0be377205f2a25b0aa830020" +checksum = "05b116685a6be0c52f5a103334cbff26db643826c7b3735fc0a3ba9871310a74" dependencies = [ "glob", ] @@ -616,14 +562,59 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + [[package]] name = "zopfli" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e14f4de12c657ae470b6b9b8e1c265f44605d10e652098d4c5be72a28cd4beb" +checksum = "b4f3cae89ab7952cf7f091fffda70f373ba3ee110ac6221b3b6c3c285b04f82e" dependencies = [ "adler32", "byteorder", "crc", + "iter-read", + "log", "typed-arena", ] diff --git a/Cargo.toml b/Cargo.toml index 19c28bf7..7232e6ed 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,46 +23,45 @@ path = "src/main.rs" required-features = ["binary"] [dependencies] -bit-vec = "^0.6.3" -byteorder = "^1.4.2" -crc = "^2.0.0" -itertools = "^0.10.0" -zopfli = { version = "0.5.0", optional = true } -miniz_oxide = "0.5" -rgb = "0.8.25" -indexmap = "1.6.1" -libdeflater = { version = "0.8.0", optional = true } -log = "0.4.14" -stderrlog = { version = "0.5.2", optional = true } -crossbeam-channel = "0.5.0" +bit-vec = "0.6.3" +crc = "3.0.0" +itertools = "0.10.3" +zopfli = { version = "0.7.0", optional = true } +miniz_oxide = "0.5.3" +rgb = "0.8.33" +indexmap = "1.9.1" +libdeflater = { version = "0.10.0", optional = true } +log = "0.4.17" +stderrlog = { version = "0.5.3", optional = true, default-features = false } +crossbeam-channel = "0.5.6" [dependencies.filetime] optional = true -version = "0.2.13" +version = "0.2.17" [dependencies.rayon] optional = true -version = "^1.5.0" +version = "1.5.3" [dependencies.clap] optional = true -version = "3.0.0" +version = "3.2.17" [dependencies.wild] optional = true -version = "2.0.4" +version = "2.1.0" [dependencies.image] default-features = false features = ["png"] -version = "0.23" +version = "0.24.3" [target.'cfg(any(target_arch = "x86_64", target_arch = "aarch64"))'.dependencies.cloudflare-zlib] features = ["arm-always"] -version = "^0.2.2" +version = "0.2.9" [build-dependencies] -rustc_version = "0.4" +rustc_version = "0.4.0" [features] binary = ["clap", "wild", "stderrlog"] diff --git a/src/headers.rs b/src/headers.rs index 590aa205..1183ca69 100644 --- a/src/headers.rs +++ b/src/headers.rs @@ -1,10 +1,10 @@ use crate::colors::{BitDepth, ColorType}; use crate::error::PngError; use crate::PngResult; -use byteorder::{BigEndian, ReadBytesExt}; use crc::{Crc, CRC_32_ISO_HDLC}; use indexmap::IndexSet; -use std::io::Cursor; +use std::io; +use std::io::{Cursor, Read}; #[derive(Debug, Clone, Copy)] /// Headers from the IHDR chunk of the image @@ -102,7 +102,7 @@ pub fn parse_next_header<'a>( .get(*byte_offset..*byte_offset + 4) .ok_or(PngError::TruncatedData)?, ); - let length = rdr.read_u32::().unwrap(); + let length = read_be_u32(&mut rdr).unwrap(); *byte_offset += 4; let header_start = *byte_offset; @@ -124,7 +124,7 @@ pub fn parse_next_header<'a>( .get(*byte_offset..*byte_offset + 4) .ok_or(PngError::TruncatedData)?, ); - let crc = rdr.read_u32::().unwrap(); + let crc = read_be_u32(&mut rdr).unwrap(); *byte_offset += 4; let header_bytes = byte_data @@ -163,14 +163,17 @@ pub fn parse_ihdr_header(byte_data: &[u8]) -> PngResult { 16 => BitDepth::Sixteen, _ => return Err(PngError::new("Unexpected bit depth in header")), }, - width: rdr - .read_u32::() - .map_err(|_| PngError::TruncatedData)?, - height: rdr - .read_u32::() - .map_err(|_| PngError::TruncatedData)?, + width: read_be_u32(&mut rdr).map_err(|_| PngError::TruncatedData)?, + height: read_be_u32(&mut rdr).map_err(|_| PngError::TruncatedData)?, compression: byte_data[10], filter: byte_data[11], interlaced, }) } + +#[inline] +fn read_be_u32>(rdr: &mut Cursor) -> Result { + let mut int_buf = [0; 4]; + rdr.read_exact(&mut int_buf)?; + Ok(u32::from_be_bytes(int_buf)) +} diff --git a/src/lib.rs b/src/lib.rs index ec9e2c58..441d8849 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,7 +37,7 @@ use log::{debug, error, info, warn}; use rayon::prelude::*; use std::fmt; use std::fs::{copy, File, Metadata}; -use std::io::{stdin, stdout, BufWriter, Read, Write}; +use std::io::{stdin, stdout, BufWriter, Cursor, Read, Write}; use std::path::{Path, PathBuf}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; @@ -710,8 +710,8 @@ fn optimize_png( } let (old_png, new_png) = rayon::join( - || image::load_from_memory_with_format(original_data, ImageFormat::Png), - || image::load_from_memory_with_format(&output, ImageFormat::Png), + || load_png_image_from_memory(original_data), + || load_png_image_from_memory(&output), ); if let Ok(new_png) = new_png { @@ -1076,6 +1076,14 @@ fn copy_times(input_path_meta: &Metadata, out_path: &Path) -> PngResult<()> { }) } +/// Loads a PNG image from memory to a [DynamicImage] +fn load_png_image_from_memory(png_data: &[u8]) -> Result { + let mut reader = image::io::Reader::new(Cursor::new(png_data)); + reader.set_format(ImageFormat::Png); + reader.no_limits(); + reader.decode() +} + /// Compares images pixel by pixel for equivalent content fn images_equal(old_png: &DynamicImage, new_png: &DynamicImage) -> bool { let a = old_png.pixels().filter(|x| { diff --git a/src/png/mod.rs b/src/png/mod.rs index b429bb9f..b625de9c 100644 --- a/src/png/mod.rs +++ b/src/png/mod.rs @@ -4,13 +4,12 @@ use crate::error::PngError; use crate::filters::*; use crate::headers::*; use crate::interlace::{deinterlace_image, interlace_image}; -use byteorder::{BigEndian, WriteBytesExt}; use crc::{Crc, CRC_32_ISO_HDLC}; use indexmap::IndexMap; use rgb::ComponentSlice; use rgb::RGBA8; use std::fs::File; -use std::io::{BufReader, Read}; +use std::io::{BufReader, Read, Write}; use std::iter::Iterator; use std::path::Path; use std::sync::Arc; @@ -175,13 +174,17 @@ impl PngData { let mut output = vec![0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]; // IHDR let mut ihdr_data = Vec::with_capacity(13); - let _ = ihdr_data.write_u32::(self.raw.ihdr.width); - let _ = ihdr_data.write_u32::(self.raw.ihdr.height); - let _ = ihdr_data.write_u8(self.raw.ihdr.bit_depth.as_u8()); - let _ = ihdr_data.write_u8(self.raw.ihdr.color_type.png_header_code()); - let _ = ihdr_data.write_u8(0); // Compression -- deflate - let _ = ihdr_data.write_u8(0); // Filter method -- 5-way adaptive filtering - let _ = ihdr_data.write_u8(self.raw.ihdr.interlaced); + ihdr_data.write_all(&self.raw.ihdr.width.to_be_bytes()).ok(); + ihdr_data + .write_all(&self.raw.ihdr.height.to_be_bytes()) + .ok(); + ihdr_data.write_all(&[self.raw.ihdr.bit_depth.as_u8()]).ok(); + ihdr_data + .write_all(&[self.raw.ihdr.color_type.png_header_code()]) + .ok(); + ihdr_data.write_all(&[0]).ok(); // Compression -- deflate + ihdr_data.write_all(&[0]).ok(); // Filter method -- 5-way adaptive filtering + ihdr_data.write_all(&[self.raw.ihdr.interlaced]).ok(); write_png_block(b"IHDR", &ihdr_data, &mut output); // Ancillary headers for (key, header) in self @@ -369,8 +372,8 @@ fn write_png_block(key: &[u8], header: &[u8], output: &mut Vec) { header_data.extend_from_slice(key); header_data.extend_from_slice(header); output.reserve(header_data.len() + 8); - let _ = output.write_u32::(header_data.len() as u32 - 4); + output.extend_from_slice(&(header_data.len() as u32 - 4).to_be_bytes()); let crc = Crc::::new(&CRC_32_ISO_HDLC).checksum(&header_data); output.append(&mut header_data); - let _ = output.write_u32::(crc); + output.extend_from_slice(&crc.to_be_bytes()); }