927 {
928 ASSERT(sigBits);
929 ASSERT(refBits);
930
931 UINT32 valPos = 0, refPos = 0;
932 UINT32 sigPos = 0, sigEnd;
933 UINT32 zerocnt, count = 0;
934 UINT32 k = 0;
935 UINT32 runlen = 1 << k;
936 bool signBit = false;
937 bool zeroAfterRun = false;
938
939 while (valPos < bufferSize) {
940
941 sigEnd = valPos;
943 sigEnd -= valPos;
944 sigEnd += sigPos;
945
946
947
948 while (sigPos < sigEnd) {
949
950 zerocnt =
SeekBitRange(sigBits, sigPos, sigEnd - sigPos);
951 sigPos += zerocnt;
952 valPos += zerocnt;
953 if (sigPos < sigEnd) {
954
956
957
958 if (count == 0) {
959
960 if (zeroAfterRun) {
961
962 signBit = false;
963 zeroAfterRun = false;
964 } else {
965
967
968 count = runlen - 1;
969 signBit = true;
970
971
973 k++;
974 runlen <<= 1;
975 }
976 } else {
977
978 if (k > 0) {
979
981 signPos += k;
982
983
984 k--;
985 runlen >>= 1;
986 }
987 if (count > 0) {
988 count--;
989 signBit = true;
990 zeroAfterRun = true;
991 } else {
992 signBit = false;
993 }
994 }
995 }
996 } else {
997 ASSERT(count > 0);
998 ASSERT(signBit);
999 count--;
1000 }
1001
1002
1004
1005
1007 sigPos++;
1008 }
1009 }
1010
1011
1012 if (valPos < bufferSize) {
1013
1014 if (
GetBit(refBits, refPos)) {
1016 }
1017 refPos++;
1018 valPos++;
1019 }
1020 }
1021 ASSERT(sigPos <= bufferSize);
1022 ASSERT(refPos <= bufferSize);
1023 ASSERT(valPos == bufferSize);
1024
1025 return sigPos;
1026}