| Index: core/src/fxcodec/codec/fx_codec_fax.cpp
|
| diff --git a/core/src/fxcodec/codec/fx_codec_fax.cpp b/core/src/fxcodec/codec/fx_codec_fax.cpp
|
| index ff9d45d256a671a67d27ff18cfef4505b46ab107..5af1d9e7ceab99459678d6314b84426fc9518a98 100644
|
| --- a/core/src/fxcodec/codec/fx_codec_fax.cpp
|
| +++ b/core/src/fxcodec/codec/fx_codec_fax.cpp
|
| @@ -281,6 +281,191 @@ int FaxGetRun(const uint8_t* ins_array,
|
| }
|
| }
|
|
|
| +FX_BOOL FaxG4GetRow(const uint8_t* src_buf,
|
| + int bitsize,
|
| + int& bitpos,
|
| + uint8_t* dest_buf,
|
| + const uint8_t* ref_buf,
|
| + int columns) {
|
| + int a0 = -1;
|
| + bool a0color = true;
|
| + while (1) {
|
| + if (bitpos >= bitsize) {
|
| + return FALSE;
|
| + }
|
| + int a1, a2, b1, b2;
|
| + FaxG4FindB1B2(ref_buf, columns, a0, a0color, b1, b2);
|
| + FX_BOOL bit = NEXTBIT;
|
| + int v_delta = 0;
|
| + if (bit) {
|
| + } else {
|
| + if (bitpos >= bitsize) {
|
| + return FALSE;
|
| + }
|
| + FX_BOOL bit1 = NEXTBIT;
|
| + if (bitpos >= bitsize) {
|
| + return FALSE;
|
| + }
|
| + FX_BOOL bit2 = NEXTBIT;
|
| + if (bit1 && bit2) {
|
| + v_delta = 1;
|
| + } else if (bit1) {
|
| + v_delta = -1;
|
| + } else if (bit2) {
|
| + int run_len1 = 0;
|
| + while (1) {
|
| + int run = FaxGetRun(a0color ? FaxWhiteRunIns : FaxBlackRunIns,
|
| + src_buf, bitpos, bitsize);
|
| + run_len1 += run;
|
| + if (run < 64) {
|
| + break;
|
| + }
|
| + }
|
| + if (a0 < 0) {
|
| + run_len1++;
|
| + }
|
| + a1 = a0 + run_len1;
|
| + if (!a0color) {
|
| + FaxFillBits(dest_buf, columns, a0, a1);
|
| + }
|
| + int run_len2 = 0;
|
| + while (1) {
|
| + int run = FaxGetRun(a0color ? FaxBlackRunIns : FaxWhiteRunIns,
|
| + src_buf, bitpos, bitsize);
|
| + run_len2 += run;
|
| + if (run < 64) {
|
| + break;
|
| + }
|
| + }
|
| + a2 = a1 + run_len2;
|
| + if (a0color) {
|
| + FaxFillBits(dest_buf, columns, a1, a2);
|
| + }
|
| + a0 = a2;
|
| + if (a0 < columns) {
|
| + continue;
|
| + }
|
| + return TRUE;
|
| + } else {
|
| + if (bitpos >= bitsize) {
|
| + return FALSE;
|
| + }
|
| + bit = NEXTBIT;
|
| + if (bit) {
|
| + if (!a0color) {
|
| + FaxFillBits(dest_buf, columns, a0, b2);
|
| + }
|
| + if (b2 >= columns) {
|
| + return TRUE;
|
| + }
|
| + a0 = b2;
|
| + continue;
|
| + } else {
|
| + if (bitpos >= bitsize) {
|
| + return FALSE;
|
| + }
|
| + FX_BOOL bit1 = NEXTBIT;
|
| + if (bitpos >= bitsize) {
|
| + return FALSE;
|
| + }
|
| + FX_BOOL bit2 = NEXTBIT;
|
| + if (bit1 && bit2) {
|
| + v_delta = 2;
|
| + } else if (bit1) {
|
| + v_delta = -2;
|
| + } else if (bit2) {
|
| + if (bitpos >= bitsize) {
|
| + return FALSE;
|
| + }
|
| + bit = NEXTBIT;
|
| + if (bit) {
|
| + v_delta = 3;
|
| + } else {
|
| + v_delta = -3;
|
| + }
|
| + } else {
|
| + if (bitpos >= bitsize) {
|
| + return FALSE;
|
| + }
|
| + bit = NEXTBIT;
|
| + if (bit) {
|
| + bitpos += 3;
|
| + continue;
|
| + } else {
|
| + bitpos += 5;
|
| + return TRUE;
|
| + }
|
| + }
|
| + }
|
| + }
|
| + }
|
| + a1 = b1 + v_delta;
|
| + if (!a0color) {
|
| + FaxFillBits(dest_buf, columns, a0, a1);
|
| + }
|
| + if (a1 >= columns) {
|
| + return TRUE;
|
| + }
|
| + a0 = a1;
|
| + a0color = !a0color;
|
| + }
|
| +}
|
| +
|
| +FX_BOOL FaxSkipEOL(const uint8_t* src_buf, int bitsize, int& bitpos) {
|
| + int startbit = bitpos;
|
| + while (bitpos < bitsize) {
|
| + int bit = NEXTBIT;
|
| + if (bit) {
|
| + if (bitpos - startbit <= 11) {
|
| + bitpos = startbit;
|
| + }
|
| + return TRUE;
|
| + }
|
| + }
|
| + return FALSE;
|
| +}
|
| +
|
| +FX_BOOL FaxGet1DLine(const uint8_t* src_buf,
|
| + int bitsize,
|
| + int& bitpos,
|
| + uint8_t* dest_buf,
|
| + int columns) {
|
| + bool color = true;
|
| + int startpos = 0;
|
| + while (1) {
|
| + if (bitpos >= bitsize) {
|
| + return FALSE;
|
| + }
|
| + int run_len = 0;
|
| + while (1) {
|
| + int run = FaxGetRun(color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf,
|
| + bitpos, bitsize);
|
| + if (run < 0) {
|
| + while (bitpos < bitsize) {
|
| + int bit = NEXTBIT;
|
| + if (bit) {
|
| + return TRUE;
|
| + }
|
| + }
|
| + return FALSE;
|
| + }
|
| + run_len += run;
|
| + if (run < 64) {
|
| + break;
|
| + }
|
| + }
|
| + if (!color) {
|
| + FaxFillBits(dest_buf, columns, startpos, startpos + run_len);
|
| + }
|
| + startpos += run_len;
|
| + if (startpos >= columns) {
|
| + break;
|
| + }
|
| + color = !color;
|
| + }
|
| + return TRUE;
|
| +}
|
| +
|
| const uint8_t BlackRunTerminator[128] = {
|
| 0x37, 10, 0x02, 3, 0x03, 2, 0x02, 2, 0x03, 3, 0x03, 4, 0x02, 4,
|
| 0x03, 5, 0x05, 6, 0x04, 6, 0x04, 7, 0x05, 7, 0x07, 7, 0x04, 8,
|
| @@ -545,191 +730,6 @@ FX_DWORD CCodec_FaxDecoder::GetSrcOffset() {
|
| return ret;
|
| }
|
|
|
| -FX_BOOL FaxSkipEOL(const uint8_t* src_buf, int bitsize, int& bitpos) {
|
| - int startbit = bitpos;
|
| - while (bitpos < bitsize) {
|
| - int bit = NEXTBIT;
|
| - if (bit) {
|
| - if (bitpos - startbit <= 11) {
|
| - bitpos = startbit;
|
| - }
|
| - return TRUE;
|
| - }
|
| - }
|
| - return FALSE;
|
| -}
|
| -
|
| -FX_BOOL FaxGet1DLine(const uint8_t* src_buf,
|
| - int bitsize,
|
| - int& bitpos,
|
| - uint8_t* dest_buf,
|
| - int columns) {
|
| - bool color = true;
|
| - int startpos = 0;
|
| - while (1) {
|
| - if (bitpos >= bitsize) {
|
| - return FALSE;
|
| - }
|
| - int run_len = 0;
|
| - while (1) {
|
| - int run = FaxGetRun(color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf,
|
| - bitpos, bitsize);
|
| - if (run < 0) {
|
| - while (bitpos < bitsize) {
|
| - int bit = NEXTBIT;
|
| - if (bit) {
|
| - return TRUE;
|
| - }
|
| - }
|
| - return FALSE;
|
| - }
|
| - run_len += run;
|
| - if (run < 64) {
|
| - break;
|
| - }
|
| - }
|
| - if (!color) {
|
| - FaxFillBits(dest_buf, columns, startpos, startpos + run_len);
|
| - }
|
| - startpos += run_len;
|
| - if (startpos >= columns) {
|
| - break;
|
| - }
|
| - color = !color;
|
| - }
|
| - return TRUE;
|
| -}
|
| -
|
| -FX_BOOL FaxG4GetRow(const uint8_t* src_buf,
|
| - int bitsize,
|
| - int& bitpos,
|
| - uint8_t* dest_buf,
|
| - const uint8_t* ref_buf,
|
| - int columns) {
|
| - int a0 = -1;
|
| - bool a0color = true;
|
| - while (1) {
|
| - if (bitpos >= bitsize) {
|
| - return FALSE;
|
| - }
|
| - int a1, a2, b1, b2;
|
| - FaxG4FindB1B2(ref_buf, columns, a0, a0color, b1, b2);
|
| - FX_BOOL bit = NEXTBIT;
|
| - int v_delta = 0;
|
| - if (bit) {
|
| - } else {
|
| - if (bitpos >= bitsize) {
|
| - return FALSE;
|
| - }
|
| - FX_BOOL bit1 = NEXTBIT;
|
| - if (bitpos >= bitsize) {
|
| - return FALSE;
|
| - }
|
| - FX_BOOL bit2 = NEXTBIT;
|
| - if (bit1 && bit2) {
|
| - v_delta = 1;
|
| - } else if (bit1) {
|
| - v_delta = -1;
|
| - } else if (bit2) {
|
| - int run_len1 = 0;
|
| - while (1) {
|
| - int run = FaxGetRun(a0color ? FaxWhiteRunIns : FaxBlackRunIns,
|
| - src_buf, bitpos, bitsize);
|
| - run_len1 += run;
|
| - if (run < 64) {
|
| - break;
|
| - }
|
| - }
|
| - if (a0 < 0) {
|
| - run_len1++;
|
| - }
|
| - a1 = a0 + run_len1;
|
| - if (!a0color) {
|
| - FaxFillBits(dest_buf, columns, a0, a1);
|
| - }
|
| - int run_len2 = 0;
|
| - while (1) {
|
| - int run = FaxGetRun(a0color ? FaxBlackRunIns : FaxWhiteRunIns,
|
| - src_buf, bitpos, bitsize);
|
| - run_len2 += run;
|
| - if (run < 64) {
|
| - break;
|
| - }
|
| - }
|
| - a2 = a1 + run_len2;
|
| - if (a0color) {
|
| - FaxFillBits(dest_buf, columns, a1, a2);
|
| - }
|
| - a0 = a2;
|
| - if (a0 < columns) {
|
| - continue;
|
| - }
|
| - return TRUE;
|
| - } else {
|
| - if (bitpos >= bitsize) {
|
| - return FALSE;
|
| - }
|
| - bit = NEXTBIT;
|
| - if (bit) {
|
| - if (!a0color) {
|
| - FaxFillBits(dest_buf, columns, a0, b2);
|
| - }
|
| - if (b2 >= columns) {
|
| - return TRUE;
|
| - }
|
| - a0 = b2;
|
| - continue;
|
| - } else {
|
| - if (bitpos >= bitsize) {
|
| - return FALSE;
|
| - }
|
| - FX_BOOL bit1 = NEXTBIT;
|
| - if (bitpos >= bitsize) {
|
| - return FALSE;
|
| - }
|
| - FX_BOOL bit2 = NEXTBIT;
|
| - if (bit1 && bit2) {
|
| - v_delta = 2;
|
| - } else if (bit1) {
|
| - v_delta = -2;
|
| - } else if (bit2) {
|
| - if (bitpos >= bitsize) {
|
| - return FALSE;
|
| - }
|
| - bit = NEXTBIT;
|
| - if (bit) {
|
| - v_delta = 3;
|
| - } else {
|
| - v_delta = -3;
|
| - }
|
| - } else {
|
| - if (bitpos >= bitsize) {
|
| - return FALSE;
|
| - }
|
| - bit = NEXTBIT;
|
| - if (bit) {
|
| - bitpos += 3;
|
| - continue;
|
| - } else {
|
| - bitpos += 5;
|
| - return TRUE;
|
| - }
|
| - }
|
| - }
|
| - }
|
| - }
|
| - a1 = b1 + v_delta;
|
| - if (!a0color) {
|
| - FaxFillBits(dest_buf, columns, a0, a1);
|
| - }
|
| - if (a1 >= columns) {
|
| - return TRUE;
|
| - }
|
| - a0 = a1;
|
| - a0color = !a0color;
|
| - }
|
| -}
|
| -
|
| void FaxG4Decode(const uint8_t* src_buf,
|
| FX_DWORD src_size,
|
| int* pbitpos,
|
|
|