blob: 70452b8974bb4781fff2d310892e25451a42a9db [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.pdfbox.jbig2.decoder.huffman;
import java.util.ArrayList;
import java.util.List;
import org.apache.pdfbox.jbig2.*;
public class StandardTables {
static class StandardTable extends HuffmanTable {
private StandardTable(int table[][]) {
List<Code> codeTable = new ArrayList<Code>();
for (int i = 0; i < table.length; i++) {
int prefixLength = table[i][0];
int rangeLength = table[i][1];
int rangeLow = table[i][2];
boolean isLowerRange = false;
if (table[i].length > 3)
isLowerRange = true;
codeTable.add(new Code(prefixLength, rangeLength, rangeLow,
isLowerRange));
}
if (JBIG2ImageReader.DEBUG)
System.out.println(HuffmanTable.codeTableToString(codeTable));
initTree(codeTable);
}
}
// Fourth Value (999) is used for the LowerRange-line
private static final int TABLES[][][] = {
// B1
{ { 1, 4, 0 }, //
{ 2, 8, 16 }, //
{ 3, 16, 272 }, //
{ 3, 32, 65808 } /* high */
},
// B2
{ { 1, 0, 0 }, //
{ 2, 0, 1 }, //
{ 3, 0, 2 }, //
{ 4, 3, 3 }, //
{ 5, 6, 11 }, //
{ 6, 32, 75 }, /* high */
{ 6, -1, 0 } /* OOB */
},
// B3
{ { 8, 8, -256 }, //
{ 1, 0, 0 }, //
{ 2, 0, 1 }, //
{ 3, 0, 2 }, //
{ 4, 3, 3 }, //
{ 5, 6, 11 }, //
{ 8, 32, -257, 999 }, /* low */
{ 7, 32, 75 }, /* high */
{ 6, -1, 0 } /* OOB */
},
// B4
{ { 1, 0, 1 }, //
{ 2, 0, 2 }, //
{ 3, 0, 3 }, //
{ 4, 3, 4 }, //
{ 5, 6, 12 }, //
{ 5, 32, 76 } /* high */
},
// B5
{ { 7, 8, -255 }, //
{ 1, 0, 1 }, //
{ 2, 0, 2 }, //
{ 3, 0, 3 }, //
{ 4, 3, 4 }, //
{ 5, 6, 12 }, //
{ 7, 32, -256, 999 }, /* low */
{ 6, 32, 76 } /* high */
},
// B6
{ { 5, 10, -2048 }, //
{ 4, 9, -1024 }, //
{ 4, 8, -512 }, //
{ 4, 7, -256 }, //
{ 5, 6, -128 }, //
{ 5, 5, -64 }, //
{ 4, 5, -32 }, //
{ 2, 7, 0 }, //
{ 3, 7, 128 }, //
{ 3, 8, 256 }, //
{ 4, 9, 512 }, //
{ 4, 10, 1024 }, //
{ 6, 32, -2049, 999 }, /* low */
{ 6, 32, 2048 } /* high */
},
// B7
{ { 4, 9, -1024 }, //
{ 3, 8, -512 }, //
{ 4, 7, -256 }, //
{ 5, 6, -128 }, //
{ 5, 5, -64 }, //
{ 4, 5, -32 }, //
{ 4, 5, 0 }, //
{ 5, 5, 32 }, //
{ 5, 6, 64 }, //
{ 4, 7, 128 }, //
{ 3, 8, 256 }, //
{ 3, 9, 512 }, //
{ 3, 10, 1024 }, //
{ 5, 32, -1025, 999 }, /* low */
{ 5, 32, 2048 } /* high */
},
// B8
{ { 8, 3, -15 }, //
{ 9, 1, -7 }, //
{ 8, 1, -5 }, //
{ 9, 0, -3 }, //
{ 7, 0, -2 }, //
{ 4, 0, -1 }, //
{ 2, 1, 0 }, //
{ 5, 0, 2 }, //
{ 6, 0, 3 }, //
{ 3, 4, 4 }, //
{ 6, 1, 20 }, //
{ 4, 4, 22 }, //
{ 4, 5, 38 }, //
{ 5, 6, 70 }, //
{ 5, 7, 134 }, //
{ 6, 7, 262 }, //
{ 7, 8, 390 }, //
{ 6, 10, 646 }, //
{ 9, 32, -16, 999 }, /* low */
{ 9, 32, 1670 }, /* high */
{ 2, -1, 0 } /* OOB */
},
// B9
{ { 8, 4, -31 }, //
{ 9, 2, -15 }, //
{ 8, 2, -11 }, //
{ 9, 1, -7 }, //
{ 7, 1, -5 }, //
{ 4, 1, -3 }, //
{ 3, 1, -1 }, //
{ 3, 1, 1 }, //
{ 5, 1, 3 }, //
{ 6, 1, 5 }, //
{ 3, 5, 7 }, //
{ 6, 2, 39 }, //
{ 4, 5, 43 }, //
{ 4, 6, 75 }, //
{ 5, 7, 139 }, //
{ 5, 8, 267 }, //
{ 6, 8, 523 }, //
{ 7, 9, 779 }, //
{ 6, 11, 1291 }, //
{ 9, 32, -32, 999 }, /* low */
{ 9, 32, 3339 }, /* high */
{ 2, -1, 0 } /* OOB */
},
// B10
{ { 7, 4, -21 }, //
{ 8, 0, -5 }, //
{ 7, 0, -4 }, //
{ 5, 0, -3 }, //
{ 2, 2, -2 }, //
{ 5, 0, 2 }, //
{ 6, 0, 3 }, //
{ 7, 0, 4 }, //
{ 8, 0, 5 }, //
{ 2, 6, 6 }, //
{ 5, 5, 70 }, //
{ 6, 5, 102 }, //
{ 6, 6, 134 }, //
{ 6, 7, 198 }, //
{ 6, 8, 326 }, //
{ 6, 9, 582 }, //
{ 6, 10, 1094 }, //
{ 7, 11, 2118 }, //
{ 8, 32, -22, 999 }, /* low */
{ 8, 32, 4166 }, /* high */
{ 2, -1, 0 } /* OOB */
},
// B11
{ { 1, 0, 1 }, //
{ 2, 1, 2 }, //
{ 4, 0, 4 }, //
{ 4, 1, 5 }, //
{ 5, 1, 7 }, //
{ 5, 2, 9 }, //
{ 6, 2, 13 }, //
{ 7, 2, 17 }, //
{ 7, 3, 21 }, //
{ 7, 4, 29 }, //
{ 7, 5, 45 }, //
{ 7, 6, 77 }, //
{ 7, 32, 141 } /* high */
},
// B12
{ { 1, 0, 1 }, //
{ 2, 0, 2 }, //
{ 3, 1, 3 }, //
{ 5, 0, 5 }, //
{ 5, 1, 6 }, //
{ 6, 1, 8 }, //
{ 7, 0, 10 }, //
{ 7, 1, 11 }, //
{ 7, 2, 13 }, //
{ 7, 3, 17 }, //
{ 7, 4, 25 }, //
{ 8, 5, 41 }, //
{ 8, 32, 73 } //
},
// B13
{ { 1, 0, 1 }, //
{ 3, 0, 2 }, //
{ 4, 0, 3 }, //
{ 5, 0, 4 }, //
{ 4, 1, 5 }, //
{ 3, 3, 7 }, //
{ 6, 1, 15 }, //
{ 6, 2, 17 }, //
{ 6, 3, 21 }, //
{ 6, 4, 29 }, //
{ 6, 5, 45 }, //
{ 7, 6, 77 }, //
{ 7, 32, 141 } /* high */
},
// B14
{ { 3, 0, -2 }, //
{ 3, 0, -1 }, //
{ 1, 0, 0 }, //
{ 3, 0, 1 }, //
{ 3, 0, 2 } //
},
// B15
{ { 7, 4, -24 }, //
{ 6, 2, -8 }, //
{ 5, 1, -4 }, //
{ 4, 0, -2 }, //
{ 3, 0, -1 }, //
{ 1, 0, 0 }, //
{ 3, 0, 1 }, //
{ 4, 0, 2 }, //
{ 5, 1, 3 }, //
{ 6, 2, 5 }, //
{ 7, 4, 9 }, //
{ 7, 32, -25, 999 }, /* low */
{ 7, 32, 25 } /* high */
} };
private static HuffmanTable STANDARD_TABLES[] = new HuffmanTable[TABLES.length];
public static HuffmanTable getTable(int number) {
HuffmanTable table = STANDARD_TABLES[number - 1];
if (table == null) {
table = new StandardTable(TABLES[number - 1]);
STANDARD_TABLES[number - 1] = table;
}
return table;
}
}