package org.atriasoft.pngencoder; import java.util.Objects; class PngEncoderDeflaterSegmentResult { // https://github.com/madler/zlib/blob/master/adler32.c#L143 static long combine(final long adler1, final long adler2, final long len2) { long BASEL = 65521; long sum1; long sum2; long rem; rem = len2 % BASEL; sum1 = adler1 & 0xffffL; sum2 = rem * sum1; sum2 %= BASEL; sum1 += (adler2 & 0xffffL) + BASEL - 1; sum2 += ((adler1 >> 16) & 0xffffL) + ((adler2 >> 16) & 0xffffL) + BASEL - rem; if (sum1 >= BASEL) { sum1 -= BASEL; } if (sum1 >= BASEL) { sum1 -= BASEL; } if (sum2 >= (BASEL << 1)) { sum2 -= (BASEL << 1); } if (sum2 >= BASEL) { sum2 -= BASEL; } return sum1 | (sum2 << 16); } private final PngEncoderDeflaterBuffer deflatedSegment; private final PngEncoderDeflaterBuffer originalSegment; private final long originalSegmentAdler32; private final int originalSegmentLength; PngEncoderDeflaterSegmentResult(final PngEncoderDeflaterBuffer originalSegment, final PngEncoderDeflaterBuffer deflatedSegment, final long originalSegmentAdler32, final int originalSegmentLength) { this.originalSegment = Objects.requireNonNull(originalSegment, "originalSegment"); this.deflatedSegment = Objects.requireNonNull(deflatedSegment, "deflatedSegment"); this.originalSegmentAdler32 = originalSegmentAdler32; this.originalSegmentLength = originalSegmentLength; } public PngEncoderDeflaterBuffer getDeflatedSegment() { return this.deflatedSegment; } public PngEncoderDeflaterBuffer getOriginalSegment() { return this.originalSegment; } long getUpdatedAdler32(final long originalAdler32) { return PngEncoderDeflaterSegmentResult.combine(originalAdler32, this.originalSegmentAdler32, this.originalSegmentLength); } }