| 846 | } |
| 847 | |
| 848 | bool HuffmanProcessor::writeHuffBuffer(BitStream* pStream, const char* out_pBuffer, S32 maxLen) |
| 849 | { |
| 850 | if (out_pBuffer == NULL) { |
| 851 | pStream->writeFlag(false); |
| 852 | pStream->writeInt(0, 8); |
| 853 | return true; |
| 854 | } |
| 855 | |
| 856 | if (m_tablesBuilt == false) |
| 857 | buildTables(); |
| 858 | |
| 859 | S32 len = out_pBuffer ? dStrlen(out_pBuffer) : 0; |
| 860 | AssertWarn(len <= 255, "String TOO long for writeString"); |
| 861 | AssertWarn(len <= 255, out_pBuffer); |
| 862 | if (len > maxLen) |
| 863 | len = maxLen; |
| 864 | |
| 865 | S32 numBits = 0; |
| 866 | S32 i; |
| 867 | for (i = 0; i < len; i++) |
| 868 | numBits += m_huffLeaves[(unsigned char)out_pBuffer[i]].numBits; |
| 869 | |
| 870 | if (numBits >= (len * 8)) { |
| 871 | pStream->writeFlag(false); |
| 872 | pStream->writeInt(len, 8); |
| 873 | pStream->write(len, out_pBuffer); |
| 874 | } else { |
| 875 | pStream->writeFlag(true); |
| 876 | pStream->writeInt(len, 8); |
| 877 | for (i = 0; i < len; i++) { |
| 878 | HuffLeaf& rLeaf = m_huffLeaves[((unsigned char)out_pBuffer[i])]; |
| 879 | pStream->writeBits(rLeaf.numBits, &rLeaf.code); |
| 880 | } |
| 881 | } |
| 882 | |
| 883 | return true; |
| 884 | } |
| 885 | |
| 886 | const U32 HuffmanProcessor::csm_charFreqs[256] = { |
| 887 | 0 , |