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