Back to... PDF Writer

Source file : gid-decoding_png-huffman.ads



--  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 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_M32;

  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;


Ada PDF Writer: Ada package for writing PDF files (.pdf). Ada programming.
Some news about Ada PDF Writer and other Ada projects on Gautier's blog.