• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * DeltaOptions
3  *
4  * Author: Lasse Collin <lasse.collin@tukaani.org>
5  *
6  * This file has been put into the public domain.
7  * You can do whatever you want with this file.
8  */
9 
10 package org.tukaani.xz;
11 
12 import java.io.InputStream;
13 
14 /**
15  * Delta filter options. The Delta filter can be used only as a non-last
16  * filter in the chain, for example Delta + LZMA2.
17  * <p>
18  * Currently only simple byte-wise delta is supported. The only option
19  * is the delta distance, which you should set to match your data.
20  * It's not possible to provide a generic default value for it.
21  * <p>
22  * For example, with distance = 2 and eight-byte input
23  * A1 B1 A2 B3 A3 B5 A4 B7, the output will be A1 B1 01 02 01 02 01 02.
24  * <p>
25  * The Delta filter can be good with uncompressed bitmap images. It can
26  * also help with PCM audio, although special-purpose compressors like
27  * FLAC will give much smaller result at much better compression speed.
28  */
29 public class DeltaOptions extends FilterOptions {
30     /**
31      * Smallest supported delta calculation distance.
32      */
33     public static final int DISTANCE_MIN = 1;
34 
35     /**
36      * Largest supported delta calculation distance.
37      */
38     public static final int DISTANCE_MAX = 256;
39 
40     private int distance = DISTANCE_MIN;
41 
42     /**
43      * Creates new Delta options and sets the delta distance to 1 byte.
44      */
DeltaOptions()45     public DeltaOptions() {}
46 
47     /**
48      * Creates new Delta options and sets the distance to the given value.
49      */
DeltaOptions(int distance)50     public DeltaOptions(int distance) throws UnsupportedOptionsException {
51         setDistance(distance);
52     }
53 
54     /**
55      * Sets the delta distance in bytes. The new distance must be in
56      * the range [DISTANCE_MIN, DISTANCE_MAX].
57      */
setDistance(int distance)58     public void setDistance(int distance) throws UnsupportedOptionsException {
59         if (distance < DISTANCE_MIN || distance > DISTANCE_MAX)
60             throw new UnsupportedOptionsException(
61                     "Delta distance must be in the range [" + DISTANCE_MIN
62                     + ", " + DISTANCE_MAX + "]: " + distance);
63 
64         this.distance = distance;
65     }
66 
67     /**
68      * Gets the delta distance.
69      */
getDistance()70     public int getDistance() {
71         return distance;
72     }
73 
getEncoderMemoryUsage()74     public int getEncoderMemoryUsage() {
75         return DeltaOutputStream.getMemoryUsage();
76     }
77 
getOutputStream(FinishableOutputStream out, ArrayCache arrayCache)78     public FinishableOutputStream getOutputStream(FinishableOutputStream out,
79                                                   ArrayCache arrayCache) {
80         return new DeltaOutputStream(out, this);
81     }
82 
getDecoderMemoryUsage()83     public int getDecoderMemoryUsage() {
84         return 1;
85     }
86 
getInputStream(InputStream in, ArrayCache arrayCache)87     public InputStream getInputStream(InputStream in, ArrayCache arrayCache) {
88         return new DeltaInputStream(in, distance);
89     }
90 
getFilterEncoder()91     FilterEncoder getFilterEncoder() {
92         return new DeltaEncoder(this);
93     }
94 
clone()95     public Object clone() {
96         try {
97             return super.clone();
98         } catch (CloneNotSupportedException e) {
99             assert false;
100             throw new RuntimeException();
101         }
102     }
103 }
104