Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Side by Side Diff: core/src/fxcodec/codec/fx_codec_fax.cpp

Issue 1419473006: XFA: bring fx_codec_fax in-line with master (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/include/fxcodec/fx_codec.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "../../../include/fxcodec/fx_codec.h" 7 #include "../../../include/fxcodec/fx_codec.h"
8 #include "codec_int.h" 8 #include "codec_int.h"
9 9
10 namespace { 10 namespace {
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 bitpos++; 274 bitpos++;
275 int next_off = ins_off + ins * 3; 275 int next_off = ins_off + ins * 3;
276 for (; ins_off < next_off; ins_off += 3) { 276 for (; ins_off < next_off; ins_off += 3) {
277 if (ins_array[ins_off] == code) { 277 if (ins_array[ins_off] == code) {
278 return ins_array[ins_off + 1] + ins_array[ins_off + 2] * 256; 278 return ins_array[ins_off + 1] + ins_array[ins_off + 2] * 256;
279 } 279 }
280 } 280 }
281 } 281 }
282 } 282 }
283 283
284 FX_BOOL FaxG4GetRow(const uint8_t* src_buf,
285 int bitsize,
286 int& bitpos,
287 uint8_t* dest_buf,
288 const uint8_t* ref_buf,
289 int columns) {
290 int a0 = -1;
291 bool a0color = true;
292 while (1) {
293 if (bitpos >= bitsize) {
294 return FALSE;
295 }
296 int a1, a2, b1, b2;
297 FaxG4FindB1B2(ref_buf, columns, a0, a0color, b1, b2);
298 FX_BOOL bit = NEXTBIT;
299 int v_delta = 0;
300 if (bit) {
301 } else {
302 if (bitpos >= bitsize) {
303 return FALSE;
304 }
305 FX_BOOL bit1 = NEXTBIT;
306 if (bitpos >= bitsize) {
307 return FALSE;
308 }
309 FX_BOOL bit2 = NEXTBIT;
310 if (bit1 && bit2) {
311 v_delta = 1;
312 } else if (bit1) {
313 v_delta = -1;
314 } else if (bit2) {
315 int run_len1 = 0;
316 while (1) {
317 int run = FaxGetRun(a0color ? FaxWhiteRunIns : FaxBlackRunIns,
318 src_buf, bitpos, bitsize);
319 run_len1 += run;
320 if (run < 64) {
321 break;
322 }
323 }
324 if (a0 < 0) {
325 run_len1++;
326 }
327 a1 = a0 + run_len1;
328 if (!a0color) {
329 FaxFillBits(dest_buf, columns, a0, a1);
330 }
331 int run_len2 = 0;
332 while (1) {
333 int run = FaxGetRun(a0color ? FaxBlackRunIns : FaxWhiteRunIns,
334 src_buf, bitpos, bitsize);
335 run_len2 += run;
336 if (run < 64) {
337 break;
338 }
339 }
340 a2 = a1 + run_len2;
341 if (a0color) {
342 FaxFillBits(dest_buf, columns, a1, a2);
343 }
344 a0 = a2;
345 if (a0 < columns) {
346 continue;
347 }
348 return TRUE;
349 } else {
350 if (bitpos >= bitsize) {
351 return FALSE;
352 }
353 bit = NEXTBIT;
354 if (bit) {
355 if (!a0color) {
356 FaxFillBits(dest_buf, columns, a0, b2);
357 }
358 if (b2 >= columns) {
359 return TRUE;
360 }
361 a0 = b2;
362 continue;
363 } else {
364 if (bitpos >= bitsize) {
365 return FALSE;
366 }
367 FX_BOOL bit1 = NEXTBIT;
368 if (bitpos >= bitsize) {
369 return FALSE;
370 }
371 FX_BOOL bit2 = NEXTBIT;
372 if (bit1 && bit2) {
373 v_delta = 2;
374 } else if (bit1) {
375 v_delta = -2;
376 } else if (bit2) {
377 if (bitpos >= bitsize) {
378 return FALSE;
379 }
380 bit = NEXTBIT;
381 if (bit) {
382 v_delta = 3;
383 } else {
384 v_delta = -3;
385 }
386 } else {
387 if (bitpos >= bitsize) {
388 return FALSE;
389 }
390 bit = NEXTBIT;
391 if (bit) {
392 bitpos += 3;
393 continue;
394 } else {
395 bitpos += 5;
396 return TRUE;
397 }
398 }
399 }
400 }
401 }
402 a1 = b1 + v_delta;
403 if (!a0color) {
404 FaxFillBits(dest_buf, columns, a0, a1);
405 }
406 if (a1 >= columns) {
407 return TRUE;
408 }
409 a0 = a1;
410 a0color = !a0color;
411 }
412 }
413
414 FX_BOOL FaxSkipEOL(const uint8_t* src_buf, int bitsize, int& bitpos) {
415 int startbit = bitpos;
416 while (bitpos < bitsize) {
417 int bit = NEXTBIT;
418 if (bit) {
419 if (bitpos - startbit <= 11) {
420 bitpos = startbit;
421 }
422 return TRUE;
423 }
424 }
425 return FALSE;
426 }
427
428 FX_BOOL FaxGet1DLine(const uint8_t* src_buf,
429 int bitsize,
430 int& bitpos,
431 uint8_t* dest_buf,
432 int columns) {
433 bool color = true;
434 int startpos = 0;
435 while (1) {
436 if (bitpos >= bitsize) {
437 return FALSE;
438 }
439 int run_len = 0;
440 while (1) {
441 int run = FaxGetRun(color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf,
442 bitpos, bitsize);
443 if (run < 0) {
444 while (bitpos < bitsize) {
445 int bit = NEXTBIT;
446 if (bit) {
447 return TRUE;
448 }
449 }
450 return FALSE;
451 }
452 run_len += run;
453 if (run < 64) {
454 break;
455 }
456 }
457 if (!color) {
458 FaxFillBits(dest_buf, columns, startpos, startpos + run_len);
459 }
460 startpos += run_len;
461 if (startpos >= columns) {
462 break;
463 }
464 color = !color;
465 }
466 return TRUE;
467 }
468
284 const uint8_t BlackRunTerminator[128] = { 469 const uint8_t BlackRunTerminator[128] = {
285 0x37, 10, 0x02, 3, 0x03, 2, 0x02, 2, 0x03, 3, 0x03, 4, 0x02, 4, 470 0x37, 10, 0x02, 3, 0x03, 2, 0x02, 2, 0x03, 3, 0x03, 4, 0x02, 4,
286 0x03, 5, 0x05, 6, 0x04, 6, 0x04, 7, 0x05, 7, 0x07, 7, 0x04, 8, 471 0x03, 5, 0x05, 6, 0x04, 6, 0x04, 7, 0x05, 7, 0x07, 7, 0x04, 8,
287 0x07, 8, 0x18, 9, 0x17, 10, 0x18, 10, 0x08, 10, 0x67, 11, 0x68, 11, 472 0x07, 8, 0x18, 9, 0x17, 10, 0x18, 10, 0x08, 10, 0x67, 11, 0x68, 11,
288 0x6c, 11, 0x37, 11, 0x28, 11, 0x17, 11, 0x18, 11, 0xca, 12, 0xcb, 12, 473 0x6c, 11, 0x37, 11, 0x28, 11, 0x17, 11, 0x18, 11, 0xca, 12, 0xcb, 12,
289 0xcc, 12, 0xcd, 12, 0x68, 12, 0x69, 12, 0x6a, 12, 0x6b, 12, 0xd2, 12, 474 0xcc, 12, 0xcd, 12, 0x68, 12, 0x69, 12, 0x6a, 12, 0x6b, 12, 0xd2, 12,
290 0xd3, 12, 0xd4, 12, 0xd5, 12, 0xd6, 12, 0xd7, 12, 0x6c, 12, 0x6d, 12, 475 0xd3, 12, 0xd4, 12, 0xd5, 12, 0xd6, 12, 0xd7, 12, 0x6c, 12, 0x6d, 12,
291 0xda, 12, 0xdb, 12, 0x54, 12, 0x55, 12, 0x56, 12, 0x57, 12, 0x64, 12, 476 0xda, 12, 0xdb, 12, 0x54, 12, 0x55, 12, 0x56, 12, 0x57, 12, 0x64, 12,
292 0x65, 12, 0x52, 12, 0x53, 12, 0x24, 12, 0x37, 12, 0x38, 12, 0x27, 12, 477 0x65, 12, 0x52, 12, 0x53, 12, 0x24, 12, 0x37, 12, 0x38, 12, 0x27, 12,
293 0x28, 12, 0x58, 12, 0x59, 12, 0x2b, 12, 0x2c, 12, 0x5a, 12, 0x66, 12, 478 0x28, 12, 0x58, 12, 0x59, 12, 0x2b, 12, 0x2c, 12, 0x5a, 12, 0x66, 12,
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 return m_pScanlineBuf; 723 return m_pScanlineBuf;
539 } 724 }
540 FX_DWORD CCodec_FaxDecoder::GetSrcOffset() { 725 FX_DWORD CCodec_FaxDecoder::GetSrcOffset() {
541 FX_DWORD ret = (bitpos + 7) / 8; 726 FX_DWORD ret = (bitpos + 7) / 8;
542 if (ret > m_SrcSize) { 727 if (ret > m_SrcSize) {
543 ret = m_SrcSize; 728 ret = m_SrcSize;
544 } 729 }
545 return ret; 730 return ret;
546 } 731 }
547 732
548 FX_BOOL FaxSkipEOL(const uint8_t* src_buf, int bitsize, int& bitpos) {
549 int startbit = bitpos;
550 while (bitpos < bitsize) {
551 int bit = NEXTBIT;
552 if (bit) {
553 if (bitpos - startbit <= 11) {
554 bitpos = startbit;
555 }
556 return TRUE;
557 }
558 }
559 return FALSE;
560 }
561
562 FX_BOOL FaxGet1DLine(const uint8_t* src_buf,
563 int bitsize,
564 int& bitpos,
565 uint8_t* dest_buf,
566 int columns) {
567 bool color = true;
568 int startpos = 0;
569 while (1) {
570 if (bitpos >= bitsize) {
571 return FALSE;
572 }
573 int run_len = 0;
574 while (1) {
575 int run = FaxGetRun(color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf,
576 bitpos, bitsize);
577 if (run < 0) {
578 while (bitpos < bitsize) {
579 int bit = NEXTBIT;
580 if (bit) {
581 return TRUE;
582 }
583 }
584 return FALSE;
585 }
586 run_len += run;
587 if (run < 64) {
588 break;
589 }
590 }
591 if (!color) {
592 FaxFillBits(dest_buf, columns, startpos, startpos + run_len);
593 }
594 startpos += run_len;
595 if (startpos >= columns) {
596 break;
597 }
598 color = !color;
599 }
600 return TRUE;
601 }
602
603 FX_BOOL FaxG4GetRow(const uint8_t* src_buf,
604 int bitsize,
605 int& bitpos,
606 uint8_t* dest_buf,
607 const uint8_t* ref_buf,
608 int columns) {
609 int a0 = -1;
610 bool a0color = true;
611 while (1) {
612 if (bitpos >= bitsize) {
613 return FALSE;
614 }
615 int a1, a2, b1, b2;
616 FaxG4FindB1B2(ref_buf, columns, a0, a0color, b1, b2);
617 FX_BOOL bit = NEXTBIT;
618 int v_delta = 0;
619 if (bit) {
620 } else {
621 if (bitpos >= bitsize) {
622 return FALSE;
623 }
624 FX_BOOL bit1 = NEXTBIT;
625 if (bitpos >= bitsize) {
626 return FALSE;
627 }
628 FX_BOOL bit2 = NEXTBIT;
629 if (bit1 && bit2) {
630 v_delta = 1;
631 } else if (bit1) {
632 v_delta = -1;
633 } else if (bit2) {
634 int run_len1 = 0;
635 while (1) {
636 int run = FaxGetRun(a0color ? FaxWhiteRunIns : FaxBlackRunIns,
637 src_buf, bitpos, bitsize);
638 run_len1 += run;
639 if (run < 64) {
640 break;
641 }
642 }
643 if (a0 < 0) {
644 run_len1++;
645 }
646 a1 = a0 + run_len1;
647 if (!a0color) {
648 FaxFillBits(dest_buf, columns, a0, a1);
649 }
650 int run_len2 = 0;
651 while (1) {
652 int run = FaxGetRun(a0color ? FaxBlackRunIns : FaxWhiteRunIns,
653 src_buf, bitpos, bitsize);
654 run_len2 += run;
655 if (run < 64) {
656 break;
657 }
658 }
659 a2 = a1 + run_len2;
660 if (a0color) {
661 FaxFillBits(dest_buf, columns, a1, a2);
662 }
663 a0 = a2;
664 if (a0 < columns) {
665 continue;
666 }
667 return TRUE;
668 } else {
669 if (bitpos >= bitsize) {
670 return FALSE;
671 }
672 bit = NEXTBIT;
673 if (bit) {
674 if (!a0color) {
675 FaxFillBits(dest_buf, columns, a0, b2);
676 }
677 if (b2 >= columns) {
678 return TRUE;
679 }
680 a0 = b2;
681 continue;
682 } else {
683 if (bitpos >= bitsize) {
684 return FALSE;
685 }
686 FX_BOOL bit1 = NEXTBIT;
687 if (bitpos >= bitsize) {
688 return FALSE;
689 }
690 FX_BOOL bit2 = NEXTBIT;
691 if (bit1 && bit2) {
692 v_delta = 2;
693 } else if (bit1) {
694 v_delta = -2;
695 } else if (bit2) {
696 if (bitpos >= bitsize) {
697 return FALSE;
698 }
699 bit = NEXTBIT;
700 if (bit) {
701 v_delta = 3;
702 } else {
703 v_delta = -3;
704 }
705 } else {
706 if (bitpos >= bitsize) {
707 return FALSE;
708 }
709 bit = NEXTBIT;
710 if (bit) {
711 bitpos += 3;
712 continue;
713 } else {
714 bitpos += 5;
715 return TRUE;
716 }
717 }
718 }
719 }
720 }
721 a1 = b1 + v_delta;
722 if (!a0color) {
723 FaxFillBits(dest_buf, columns, a0, a1);
724 }
725 if (a1 >= columns) {
726 return TRUE;
727 }
728 a0 = a1;
729 a0color = !a0color;
730 }
731 }
732
733 void FaxG4Decode(const uint8_t* src_buf, 733 void FaxG4Decode(const uint8_t* src_buf,
734 FX_DWORD src_size, 734 FX_DWORD src_size,
735 int* pbitpos, 735 int* pbitpos,
736 uint8_t* dest_buf, 736 uint8_t* dest_buf,
737 int width, 737 int width,
738 int height, 738 int height,
739 int pitch) { 739 int pitch) {
740 if (pitch == 0) { 740 if (pitch == 0) {
741 pitch = (width + 7) / 8; 741 pitch = (width + 7) / 8;
742 } 742 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 FX_BOOL EndOfLine, 821 FX_BOOL EndOfLine,
822 FX_BOOL EncodedByteAlign, 822 FX_BOOL EncodedByteAlign,
823 FX_BOOL BlackIs1, 823 FX_BOOL BlackIs1,
824 int Columns, 824 int Columns,
825 int Rows) { 825 int Rows) {
826 CCodec_FaxDecoder* pDecoder = new CCodec_FaxDecoder; 826 CCodec_FaxDecoder* pDecoder = new CCodec_FaxDecoder;
827 pDecoder->Create(src_buf, src_size, width, height, K, EndOfLine, 827 pDecoder->Create(src_buf, src_size, width, height, K, EndOfLine,
828 EncodedByteAlign, BlackIs1, Columns, Rows); 828 EncodedByteAlign, BlackIs1, Columns, Rows);
829 return pDecoder; 829 return pDecoder;
830 } 830 }
OLDNEW
« no previous file with comments | « core/include/fxcodec/fx_codec.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698