Add initial prototype.
This commit is contained in:
88
3-mid/opengl/private/gid/gid-decoding_png-huffman.ads
Normal file
88
3-mid/opengl/private/gid/gid-decoding_png-huffman.ads
Normal file
@@ -0,0 +1,88 @@
|
||||
-- GID.Decoding_PNG.Huffman
|
||||
---------------------------
|
||||
-- Huffman tree generation and deletion.
|
||||
-- Copy of UnZip.Decompress.Huffman
|
||||
|
||||
private package GID.Decoding_PNG.Huffman is
|
||||
|
||||
-- Variants A and B.
|
||||
|
||||
-- A/ Simplistic huffman trees, pointerless
|
||||
|
||||
type Length_code_pair is record
|
||||
length: Natural;
|
||||
code : Natural;
|
||||
end record;
|
||||
|
||||
type Huff_descriptor is array(Natural range <>) of Length_code_pair;
|
||||
|
||||
nil: constant:= 0;
|
||||
root: constant:= 1;
|
||||
|
||||
type Huff_node is record
|
||||
n: Natural; -- value
|
||||
zero, one: Natural:= nil; -- index of next node, if any
|
||||
end record;
|
||||
|
||||
max_size: constant:= 800;
|
||||
|
||||
type Huff_node_list is array(1..max_size) of Huff_node;
|
||||
|
||||
type Huff_tree is record
|
||||
last: Natural:= nil;
|
||||
node: Huff_node_list;
|
||||
end record;
|
||||
|
||||
procedure Build(t: out Huff_tree; descr: in Huff_descriptor);
|
||||
|
||||
-- B/ Huffman tables: several steps in the binary tree
|
||||
-- in one jump.
|
||||
-- Pro: probably faster
|
||||
-- Contra: complicated, relies on pointers, large data.
|
||||
|
||||
type HufT_table;
|
||||
type p_HufT_table is access HufT_table;
|
||||
|
||||
invalid: constant:= 99; -- invalid value for extra bits
|
||||
|
||||
type HufT is record
|
||||
extra_bits : Natural:= invalid;
|
||||
bits : Natural;
|
||||
n : Natural;
|
||||
next_table : p_HufT_table:= null;
|
||||
end record;
|
||||
|
||||
type HufT_table is array( Integer range <> ) of aliased HufT;
|
||||
|
||||
type p_HufT is access all HufT;
|
||||
|
||||
-- Linked list just for destroying Huffman tables
|
||||
|
||||
type Table_list;
|
||||
type p_Table_list is access Table_list;
|
||||
|
||||
type Table_list is record
|
||||
table: p_HufT_table;
|
||||
next : p_Table_list;
|
||||
end record;
|
||||
|
||||
type Length_array is array(Integer range <>) of Natural;
|
||||
|
||||
empty : constant Length_array( 1..0 ):= ( others=> 0 );
|
||||
|
||||
-- Free huffman tables starting with table where t points to
|
||||
procedure HufT_free ( tl: in out p_Table_list );
|
||||
|
||||
-- Build huffman table from code lengths given by array b.all
|
||||
procedure HufT_build ( b : Length_array;
|
||||
s : Integer;
|
||||
d, e : Length_array;
|
||||
tl : out p_Table_list;
|
||||
m : in out Integer;
|
||||
huft_incomplete : out Boolean);
|
||||
|
||||
-- Possible exceptions occuring in huft_build
|
||||
huft_error, -- bad tree constructed
|
||||
huft_out_of_memory: exception; -- not enough memory
|
||||
|
||||
end GID.Decoding_PNG.Huffman;
|
||||
Reference in New Issue
Block a user