60 lines
1.8 KiB
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);
|
|
}
|
|
}
|