zlib data stream 의 압축을 해제하여, uint8Array 에 담아줍니다. inflate() 함수의 caller 가 압축을 해제한 결과물의 크기를 알고 있다는 가정 하에, uint8Array 는 항상 충분한 크기로 할당되어 있다고 생각합니다.

DEFLATE 알고리즘에 대한 설명과 inflate() 함수의 구현 과정에 대해서는 PNG 파일을 읽어보자 강좌를 읽어보시길 바랍니다. PNG 파일을 읽는 글이지만, DEFLATE 알고리즘 또한 자세히 다루고 있습니다. 해당 강좌를 작성할 때에는 DYNAMIC_HUFFMAN_CODE 만 다루고 NO_COMPRESSION , FIXED_HUFFMAN_CODE 에 대해서는 다루지 않았습니다. 고로 이 두 경우에 대해서는 이 문서에서 다루도록 하겠습니다.

위 강좌를 작성할때 본 참고자료는 https://datatracker.ietf.org/doc/html/rfc1951 입니다. 결국에는 같은 내용이지만, 이 글 또한 읽는 것을 추천드립니다.

inflate() 함수는 Texture.js , fbx.js 에서 사용됩니다.

Syntax

inflate(bitstream, uint8Array)

Parameters

bitstream

zlib data stream 이 저장되어 있는 ArrayBuffer 를 읽는 BitStream.

uint8Array

DEFLATE 압축을 해제한 결과를 담을 Uint8Array . 불필요한 재할당을 막기 위해, 인자로 받은 배열은 항상 충분한 크기로 할당되어 있다고 가정합니다. 예를 들어 FBXProperty 의 경우, 압축을 해제한 후의 크기를 나타내는 정수(ArrayLength)를 항상 제공합니다.

Return value

(non)

Description

DEFLATE 알고리즘의 전체적인 설명과 DYNAMIC_HUFFMAN_CODE 에 대한 설명은 PNG 파일을 읽어보자 에서 다루었으며, 여기서는 NO_COMPRESSION , FIXED_HUFFMAN_CODE 에 대해서 다룹니다.

먼저 btype == NO_COMPRESSION 에 대해서 볼까요? 말 그대로 압축이 되어 있지 않으므로, LEN 개의 바이트들을 output stream 으로 복사해주면 됩니다. 그렇다는 말은 읽을 바이트들의 갯수를 나타내는 정수가 주어진다는 말이겠군요. 문서에서는 정확히 다음처럼 설명하고 있습니다:

Any bits of input up to the next byte boundary are ignored.
The rest of the block consists of the following information:

0   1   2   3   4...
+---+---+---+---+================================+
|  LEN  | NLEN  |... LEN bytes of literal data...|
+---+---+---+---+================================+

LEN is the number of data bytes in the block.  NLEN is the
one's complement of LEN.