fix(geotiff): decode big endian tiles in the platform's byte order - #687
Open
james-willis wants to merge 2 commits into
Open
james-willis wants to merge 2 commits into
james-willis wants to merge 2 commits into
Conversation
james-willis
force-pushed
the
jw/big-endian-decode
branch
from
October 1, 2026 18:14
7992696 to
7142d95
Compare
james-willis
marked this pull request as ready for review
October 1, 2026 18:18
Member
|
Thanks! Could you make a PR to add a big-endian TIFF to https://github.com/developmentseed/geotiff-test-data so that we have a known TIFF to test against? |
This was referenced Oct 1, 2026
Merged
Member
|
Thanks for the associated PRs into geotiff-test-data; now we can update the submodule here and test against those files |
Bump geotiff-test-data to pick up its big endian fixtures and add them to the rasterio integration test. On main the uint16 predictor 2 fixture fails tile pixel data matches; the predictor 3 one passes either way, which guards against swapping its byte planes.
james-willis
force-pushed
the
jw/big-endian-decode
branch
from
October 5, 2026 17:13
7142d95 to
2596766
Compare
Author
|
The big endian fixtures are only in
Big endian without a predictor is fine in geotiff.js. rasterio (GDAL) decodes both fixtures correctly, and this PR matches it. |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #686.
Big endian (
MM) TIFFs decoded to byte-swapped pixel values:toTypedArrayviews the decoded bytes in the platform's byte order, andDecoderMetadatadidn't carry the file's.Changes
DecoderMetadatagains an optionallittleEndian(defaulttrue, so existing callers ofdecode()are unaffected).fetch.tssets it fromimage.tiff.isLittleEndianfor both data and mask tiles.decode()byte-swaps samples wider than 8 bits from big endian files, beforeapplyPredictor, since horizontal differencing (predictor 2) has to accumulate native-order integers.decodeRowFloatingPointalready reassembles them in platform order.Tests
Three unit tests in
decode.test.tsbuild big endian tiles from known values:IIandMM, which must agreeThe first two fail on main; the third fails if the swap is applied to predictor 3.
pnpm typecheckandbiome checkare clean.The second commit bumps
fixtures/geotiff-test-datato pick up its big endian fixtures (developmentseed/geotiff-test-data#73, #77) and adds both tointegration-rasterio.test.ts:uint16_1band_lzw_block128_predictor2_big_endian: failstile pixel data matcheson main, passes here.float32_1band_deflate_block64_predictor3_big_endian: passes either way, and guards against swapping predictor 3 byte planes.With
pixi run generate-npyas in CI, the integration suite passes 19/19 here and fails only the uint16 big endian case against main'sdecode.ts/fetch.ts.