unipdf/internal/jbig2/decoder/huffman/standard_table.go
Jacek Kucharczyk 24648f4481 Issue #144 Fix - JBIG2 - Changed integer variables types (#148)
* Fixing platform indepenedent integer size
* Cleared test logs.
* Cleared unnecessary int32
* Defined precise integer size for jbig2 segments.
2019-08-29 19:12:18 +00:00

325 lines
5.1 KiB
Go

/*
* This file is subject to the terms and conditions defined in
* file 'LICENSE.md', which is part of this source code package.
*/
package huffman
import (
"errors"
"github.com/unidoc/unipdf/v3/internal/jbig2/reader"
)
// StandardTable is the structure that defines standard jbig2 table.
type StandardTable struct {
rootNode *InternalNode
}
// Decode implements Node interface.
func (s *StandardTable) Decode(r reader.StreamReader) (int64, error) {
return s.rootNode.Decode(r)
}
// InitTree implements Tabler interface.
func (s *StandardTable) InitTree(codeTable []*Code) error {
preprocessCodes(codeTable)
for _, c := range codeTable {
if err := s.rootNode.append(c); err != nil {
return err
}
}
return nil
}
// String implements Stringer interface.
func (s *StandardTable) String() string {
return s.rootNode.String() + "\n"
}
// RootNode implements Tabler interface.
func (s *StandardTable) RootNode() *InternalNode {
return s.rootNode
}
// GetStandardTable gets the standard table for the given 'number'.
func GetStandardTable(number int) (Tabler, error) {
if number <= 0 || number > len(standardTables) {
return nil, errors.New("Index out of range")
}
table := standardTables[number-1]
if table == nil {
var err error
table, err = newStandardTable(tables[number-1])
if err != nil {
return nil, err
}
// set the table at standardTables
standardTables[number-1] = table
}
return table, nil
}
func newStandardTable(table [][]int32) (*StandardTable, error) {
var codeTable []*Code
for i := 0; i < len(table); i++ {
prefixLength := table[i][0]
rangeLength := table[i][1]
rangeLow := table[i][2]
var isLowerRange bool
if len(table[i]) > 3 {
isLowerRange = true
}
codeTable = append(codeTable, NewCode(prefixLength, rangeLength, rangeLow, isLowerRange))
}
s := &StandardTable{rootNode: newInternalNode(0)}
if err := s.InitTree(codeTable); err != nil {
return nil, err
}
return s, nil
}
var tables = [][][]int32{
// 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
},
}
var standardTables = make([]Tabler, len(tables))