package com.jotuntech.sketcher.common; import java.util.zip.Deflater; public class DiffPacker { private Deflater deflater; private byte[] encodedDiff; public DiffPacker() { deflater = new Deflater(Deflater.BEST_COMPRESSION, true); } public int pack(short[] diffAlpha, short[] diffRed, short[] diffGreen, short[] diffBlue, byte[] output) { return pack(diffAlpha, diffRed, diffGreen, diffBlue, output, 0, output.length); } public int pack(short[] diffAlpha, short[] diffRed, short[] diffGreen, short[] diffBlue, byte[] output, int ofs, int len) { /* Create buffers, or enlarge them if they are too small */ if(encodedDiff == null || encodedDiff.length < diffAlpha.length * 8) { encodedDiff = new byte[diffAlpha.length * 8]; } int lastAlpha = 0, lastRed = 0, lastGreen = 0, lastBlue = 0; for(int diffOffset = 0, alphaOffset = 0, redOffset = diffAlpha.length * 2, greenOffset = diffAlpha.length * 4, blueOffset = diffAlpha.length * 6; diffOffset < diffAlpha.length; diffOffset++, alphaOffset++, redOffset++, greenOffset++, blueOffset++) { short alpha = (short) (diffAlpha[diffOffset] - lastAlpha); short red = (short) (diffRed[diffOffset] - lastRed); short green = (short) (diffGreen[diffOffset] - lastGreen); short blue = (short) (diffBlue[diffOffset] - lastBlue); encodedDiff[alphaOffset++] = (byte) (0xFF & (alpha >> 8)); encodedDiff[alphaOffset] = (byte) (0xFF & alpha); encodedDiff[redOffset++] = (byte) (0xFF & (red >> 8)); encodedDiff[redOffset] = (byte) (0xFF & red); encodedDiff[greenOffset++] = (byte) (0xFF & (green >> 8)); encodedDiff[greenOffset] = (byte) (0xFF & green); encodedDiff[blueOffset++] = (byte) (0xFF & (blue >> 8)); encodedDiff[blueOffset] = (byte) (0xFF & blue); lastAlpha = diffAlpha[diffOffset]; lastRed = diffRed[diffOffset]; lastGreen = diffGreen[diffOffset]; lastBlue = diffBlue[diffOffset]; } /* Deflate encoded diffs */ deflater.reset(); deflater.setInput(encodedDiff, 0, diffAlpha.length * 8); deflater.finish(); int compressedLength = 0; while(!deflater.finished() && compressedLength < len) { compressedLength += deflater.deflate(output, ofs + compressedLength, len - compressedLength); } return compressedLength; } }