| 909 | } |
| 910 | |
| 911 | bool HuffmanProcessor::writeHuffBuffer(BitStream* pStream, const char* out_pBuffer, S32 maxLen) |
| 912 | { |
| 913 | if (out_pBuffer == NULL) { |
| 914 | pStream->writeFlag(false); |
| 915 | pStream->writeInt(0, 8); |
| 916 | return true; |
| 917 | } |
| 918 | |
| 919 | if (m_tablesBuilt == false) |
| 920 | buildTables(); |
| 921 | |
| 922 | S32 len = out_pBuffer ? dStrlen(out_pBuffer) : 0; |
| 923 | AssertWarn(len <= 255, "String TOO long for writeString"); |
| 924 | AssertWarn(len <= 255, out_pBuffer); |
| 925 | if (len > maxLen) |
| 926 | len = maxLen; |
| 927 | |
| 928 | S32 numBits = 0; |
| 929 | S32 i; |
| 930 | for (i = 0; i < len; i++) |
| 931 | numBits += m_huffLeaves[(unsigned char)out_pBuffer[i]].numBits; |
| 932 | |
| 933 | if (numBits >= (len * 8)) { |
| 934 | pStream->writeFlag(false); |
| 935 | pStream->writeInt(len, 8); |
| 936 | pStream->write(len, out_pBuffer); |
| 937 | } else { |
| 938 | pStream->writeFlag(true); |
| 939 | pStream->writeInt(len, 8); |
| 940 | for (i = 0; i < len; i++) { |
| 941 | HuffLeaf& rLeaf = m_huffLeaves[((unsigned char)out_pBuffer[i])]; |
| 942 | pStream->writeBits(rLeaf.numBits, &rLeaf.code); |
| 943 | } |
| 944 | } |
| 945 | |
| 946 | return true; |
| 947 | } |
| 948 | |
| 949 | const U32 HuffmanProcessor::csm_charFreqs[256] = { |
| 950 | 0 , |