png-encoder/src/org/atriasoft/pngencoder/PngEncoderDeflaterSegmentResult.java

60 lines
1.8 KiB
Java

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);
}
}