All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.badlogic.gdx.utils.compression.Lzma Maven / Gradle / Ivy

The newest version!
package com.badlogic.gdx.utils.compression;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * Adapted from LZMA SDK version 9.22.
 * 
 * This was modified to be used directly on streams,
 * rather than via the command line as in the LZMA SDK.
 * 
 * We only currently allow the default LZMA options to be used,
 * as we know it works on for our target usage.
 */
public class Lzma {
	static class CommandLine {
		public static final int kEncode = 0;
		public static final int kDecode = 1;
		public static final int kBenchmak = 2;
		
		public int Command = -1;
		public int NumBenchmarkPasses = 10;
		
		public int DictionarySize = 1 << 23;
		public boolean DictionarySizeIsDefined = false;
		
		public int Lc = 3;
		public int Lp = 0;
		public int Pb = 2;
		
		public int Fb = 128;
		public boolean FbIsDefined = false;
		
		public boolean Eos = false;
		
		public int Algorithm = 2;
		public int MatchFinder = 1;
		
		public String InFile;
		public String OutFile;
	}
	
	
	/**
	 * Compresses the given {@link InputStream} into the given {@link OutputStream}.
	 * 
	 * @param in the {@link InputStream} to compress
	 * @param out the {@link OutputStream} to compress to
	 * @throws IOException
	 */
	static public void compress(InputStream in, OutputStream out) throws IOException {
		CommandLine params = new CommandLine();
		boolean eos = false;
		if (params.Eos)
			eos = true;		
		com.badlogic.gdx.utils.compression.lzma.Encoder encoder = new com.badlogic.gdx.utils.compression.lzma.Encoder();
		if (!encoder.SetAlgorithm(params.Algorithm))
			throw new RuntimeException("Incorrect compression mode");
		if (!encoder.SetDictionarySize(params.DictionarySize))
			throw new RuntimeException("Incorrect dictionary size");
		if (!encoder.SetNumFastBytes(params.Fb))
			throw new RuntimeException("Incorrect -fb value");
		if (!encoder.SetMatchFinder(params.MatchFinder))
			throw new RuntimeException("Incorrect -mf value");
		if (!encoder.SetLcLpPb(params.Lc, params.Lp, params.Pb))
			throw new RuntimeException("Incorrect -lc or -lp or -pb value");
		encoder.SetEndMarkerMode(eos);
		encoder.WriteCoderProperties(out);
		long fileSize;
		if (eos) {
			fileSize = -1;
		}
		else {
			if ((fileSize = in.available()) == 0) {
				fileSize = -1;
			}
		}
		for (int i = 0; i < 8; i++){
			out.write((int)(fileSize >>> (8 * i)) & 0xFF);
		}
		encoder.Code(in, out, -1, -1, null);
	}
	
	/**
	 * Decompresses the given {@link InputStream} into the given {@link OutputStream}.
	 * 
	 * @param in the {@link InputStream} to decompress
	 * @param out the {@link OutputStream} to decompress to
	 * @throws IOException
	 */	
	static public void decompress(InputStream in, OutputStream out) throws IOException {
		int propertiesSize = 5;
		byte[] properties = new byte[propertiesSize];
		if (in.read(properties, 0, propertiesSize) != propertiesSize)
			throw new RuntimeException("input .lzma file is too short");
		com.badlogic.gdx.utils.compression.lzma.Decoder decoder = new com.badlogic.gdx.utils.compression.lzma.Decoder();
		if (!decoder.SetDecoderProperties(properties))
			throw new RuntimeException("Incorrect stream properties");
		long outSize = 0;
		for (int i = 0; i < 8; i++)
		{
			int v = in.read();
			if (v < 0) {
				throw new RuntimeException("Can't read stream size");
			}
			outSize |= ((long)v) << (8 * i);
		}
		if (!decoder.Code(in, out, outSize)){
			throw new RuntimeException("Error in data stream");		
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy