901 {
902 ASSERT(sigBits);
903 ASSERT(refBits);
904
905 UINT32 valPos = 0, refPos = 0;
906 UINT32 sigPos = 0, sigEnd;
907 UINT32 zerocnt, count = 0;
908 UINT32 k = 0;
909 UINT32 runlen = 1 << k;
910 bool signBit = false;
911 bool zeroAfterRun = false;
912
913 while (valPos < bufferSize) {
914
915 sigEnd = valPos;
917 sigEnd -= valPos;
918 sigEnd += sigPos;
919
920
921
922 while (sigPos < sigEnd) {
923
924 zerocnt =
SeekBitRange(sigBits, sigPos, sigEnd - sigPos);
925 sigPos += zerocnt;
926 valPos += zerocnt;
927 if (sigPos < sigEnd) {
928
930
931
932 if (count == 0) {
933
934 if (zeroAfterRun) {
935
936 signBit = false;
937 zeroAfterRun = false;
938 } else {
939
941
942 count = runlen - 1;
943 signBit = true;
944
945
947 k++;
948 runlen <<= 1;
949 }
950 } else {
951
952 if (k > 0) {
953
955 signPos += k;
956
957
958 k--;
959 runlen >>= 1;
960 }
961 if (count > 0) {
962 count--;
963 signBit = true;
964 zeroAfterRun = true;
965 } else {
966 signBit = false;
967 }
968 }
969 }
970 } else {
971 ASSERT(count > 0);
972 ASSERT(signBit);
973 count--;
974 }
975
976
978
979
981 sigPos++;
982 }
983 }
984
985
986 if (valPos < bufferSize) {
987
988 if (
GetBit(refBits, refPos)) {
990 }
991 refPos++;
992 valPos++;
993 }
994 }
995 ASSERT(sigPos <= bufferSize);
996 ASSERT(refPos <= bufferSize);
997 ASSERT(valPos == bufferSize);
998
999 return sigPos;
1000}