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

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

Issue 1545563003: Cleanup: Remove unused CFX_PSRenderer and various encoders it used. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: rebase Created 5 years 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/src/fxcodec/codec/fx_codec.cpp ('k') | core/src/fxcodec/codec/fx_codec_flate.cpp » ('j') | 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 "codec_int.h" 7 #include "codec_int.h"
8 #include "core/include/fxcodec/fx_codec.h" 8 #include "core/include/fxcodec/fx_codec.h"
9 9
10 namespace { 10 namespace {
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 } 459 }
460 startpos += run_len; 460 startpos += run_len;
461 if (startpos >= columns) { 461 if (startpos >= columns) {
462 break; 462 break;
463 } 463 }
464 color = !color; 464 color = !color;
465 } 465 }
466 return TRUE; 466 return TRUE;
467 } 467 }
468 468
469 const uint8_t BlackRunTerminator[128] = {
470 0x37, 10, 0x02, 3, 0x03, 2, 0x02, 2, 0x03, 3, 0x03, 4, 0x02, 4,
471 0x03, 5, 0x05, 6, 0x04, 6, 0x04, 7, 0x05, 7, 0x07, 7, 0x04, 8,
472 0x07, 8, 0x18, 9, 0x17, 10, 0x18, 10, 0x08, 10, 0x67, 11, 0x68, 11,
473 0x6c, 11, 0x37, 11, 0x28, 11, 0x17, 11, 0x18, 11, 0xca, 12, 0xcb, 12,
474 0xcc, 12, 0xcd, 12, 0x68, 12, 0x69, 12, 0x6a, 12, 0x6b, 12, 0xd2, 12,
475 0xd3, 12, 0xd4, 12, 0xd5, 12, 0xd6, 12, 0xd7, 12, 0x6c, 12, 0x6d, 12,
476 0xda, 12, 0xdb, 12, 0x54, 12, 0x55, 12, 0x56, 12, 0x57, 12, 0x64, 12,
477 0x65, 12, 0x52, 12, 0x53, 12, 0x24, 12, 0x37, 12, 0x38, 12, 0x27, 12,
478 0x28, 12, 0x58, 12, 0x59, 12, 0x2b, 12, 0x2c, 12, 0x5a, 12, 0x66, 12,
479 0x67, 12,
480 };
481
482 const uint8_t BlackRunMarkup[80] = {
483 0x0f, 10, 0xc8, 12, 0xc9, 12, 0x5b, 12, 0x33, 12, 0x34, 12, 0x35, 12,
484 0x6c, 13, 0x6d, 13, 0x4a, 13, 0x4b, 13, 0x4c, 13, 0x4d, 13, 0x72, 13,
485 0x73, 13, 0x74, 13, 0x75, 13, 0x76, 13, 0x77, 13, 0x52, 13, 0x53, 13,
486 0x54, 13, 0x55, 13, 0x5a, 13, 0x5b, 13, 0x64, 13, 0x65, 13, 0x08, 11,
487 0x0c, 11, 0x0d, 11, 0x12, 12, 0x13, 12, 0x14, 12, 0x15, 12, 0x16, 12,
488 0x17, 12, 0x1c, 12, 0x1d, 12, 0x1e, 12, 0x1f, 12,
489 };
490
491 const uint8_t WhiteRunTerminator[128] = {
492 0x35, 8, 0x07, 6, 0x07, 4, 0x08, 4, 0x0B, 4, 0x0C, 4, 0x0E, 4, 0x0F, 4,
493 0x13, 5, 0x14, 5, 0x07, 5, 0x08, 5, 0x08, 6, 0x03, 6, 0x34, 6, 0x35, 6,
494 0x2a, 6, 0x2B, 6, 0x27, 7, 0x0c, 7, 0x08, 7, 0x17, 7, 0x03, 7, 0x04, 7,
495 0x28, 7, 0x2B, 7, 0x13, 7, 0x24, 7, 0x18, 7, 0x02, 8, 0x03, 8, 0x1a, 8,
496 0x1b, 8, 0x12, 8, 0x13, 8, 0x14, 8, 0x15, 8, 0x16, 8, 0x17, 8, 0x28, 8,
497 0x29, 8, 0x2a, 8, 0x2b, 8, 0x2c, 8, 0x2d, 8, 0x04, 8, 0x05, 8, 0x0a, 8,
498 0x0b, 8, 0x52, 8, 0x53, 8, 0x54, 8, 0x55, 8, 0x24, 8, 0x25, 8, 0x58, 8,
499 0x59, 8, 0x5a, 8, 0x5b, 8, 0x4a, 8, 0x4b, 8, 0x32, 8, 0x33, 8, 0x34, 8,
500 };
501
502 const uint8_t WhiteRunMarkup[80] = {
503 0x1b, 5, 0x12, 5, 0x17, 6, 0x37, 7, 0x36, 8, 0x37, 8, 0x64, 8,
504 0x65, 8, 0x68, 8, 0x67, 8, 0xcc, 9, 0xcd, 9, 0xd2, 9, 0xd3, 9,
505 0xd4, 9, 0xd5, 9, 0xd6, 9, 0xd7, 9, 0xd8, 9, 0xd9, 9, 0xda, 9,
506 0xdb, 9, 0x98, 9, 0x99, 9, 0x9a, 9, 0x18, 6, 0x9b, 9, 0x08, 11,
507 0x0c, 11, 0x0d, 11, 0x12, 12, 0x13, 12, 0x14, 12, 0x15, 12, 0x16, 12,
508 0x17, 12, 0x1c, 12, 0x1d, 12, 0x1e, 12, 0x1f, 12,
509 };
510
511 void AddBitStream(uint8_t* dest_buf, int& dest_bitpos, int data, int bitlen) {
512 for (int i = bitlen - 1; i >= 0; i--) {
513 if (data & (1 << i)) {
514 dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
515 }
516 dest_bitpos++;
517 }
518 }
519
520 void FaxEncodeRun(uint8_t* dest_buf, int& dest_bitpos, int run, bool bWhite) {
521 while (run >= 2560) {
522 AddBitStream(dest_buf, dest_bitpos, 0x1f, 12);
523 run -= 2560;
524 }
525 if (run >= 64) {
526 int markup = run - run % 64;
527 const uint8_t* p = bWhite ? WhiteRunMarkup : BlackRunMarkup;
528 p += (markup / 64 - 1) * 2;
529 AddBitStream(dest_buf, dest_bitpos, *p, p[1]);
530 }
531 run %= 64;
532 const uint8_t* p = bWhite ? WhiteRunTerminator : BlackRunTerminator;
533 p += run * 2;
534 AddBitStream(dest_buf, dest_bitpos, *p, p[1]);
535 }
536
537 void FaxEncode2DLine(uint8_t* dest_buf,
538 int& dest_bitpos,
539 const uint8_t* src_buf,
540 const uint8_t* ref_buf,
541 int cols) {
542 int a0 = -1;
543 bool a0color = true;
544 while (1) {
545 int a1 = FindBit(src_buf, cols, a0 + 1, !a0color);
546 int b1, b2;
547 FaxG4FindB1B2(ref_buf, cols, a0, a0color, b1, b2);
548 if (b2 < a1) {
549 dest_bitpos += 3;
550 dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
551 dest_bitpos++;
552 a0 = b2;
553 } else if (a1 - b1 <= 3 && b1 - a1 <= 3) {
554 int delta = a1 - b1;
555 switch (delta) {
556 case 0:
557 dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
558 break;
559 case 1:
560 case 2:
561 case 3:
562 dest_bitpos += delta == 1 ? 1 : delta + 2;
563 dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
564 dest_bitpos++;
565 dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
566 break;
567 case -1:
568 case -2:
569 case -3:
570 dest_bitpos += delta == -1 ? 1 : -delta + 2;
571 dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
572 dest_bitpos++;
573 break;
574 }
575 dest_bitpos++;
576 a0 = a1;
577 a0color = !a0color;
578 } else {
579 int a2 = FindBit(src_buf, cols, a1 + 1, a0color);
580 dest_bitpos++;
581 dest_bitpos++;
582 dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
583 dest_bitpos++;
584 if (a0 < 0) {
585 a0 = 0;
586 }
587 FaxEncodeRun(dest_buf, dest_bitpos, a1 - a0, a0color);
588 FaxEncodeRun(dest_buf, dest_bitpos, a2 - a1, !a0color);
589 a0 = a2;
590 }
591 if (a0 >= cols) {
592 return;
593 }
594 }
595 }
596
597 } // namespace 469 } // namespace
598 470
599 class CCodec_FaxDecoder : public CCodec_ScanlineDecoder { 471 class CCodec_FaxDecoder : public CCodec_ScanlineDecoder {
600 public: 472 public:
601 CCodec_FaxDecoder(); 473 CCodec_FaxDecoder();
602 ~CCodec_FaxDecoder() override; 474 ~CCodec_FaxDecoder() override;
603 475
604 FX_BOOL Create(const uint8_t* src_buf, 476 FX_BOOL Create(const uint8_t* src_buf,
605 FX_DWORD src_size, 477 FX_DWORD src_size,
606 int width, 478 int width,
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 for (int iRow = 0; iRow < height; iRow++) { 619 for (int iRow = 0; iRow < height; iRow++) {
748 uint8_t* line_buf = dest_buf + iRow * pitch; 620 uint8_t* line_buf = dest_buf + iRow * pitch;
749 FXSYS_memset(line_buf, 0xff, pitch); 621 FXSYS_memset(line_buf, 0xff, pitch);
750 FaxG4GetRow(src_buf, src_size << 3, bitpos, line_buf, ref_buf, width); 622 FaxG4GetRow(src_buf, src_size << 3, bitpos, line_buf, ref_buf, width);
751 FXSYS_memcpy(ref_buf, line_buf, pitch); 623 FXSYS_memcpy(ref_buf, line_buf, pitch);
752 } 624 }
753 FX_Free(ref_buf); 625 FX_Free(ref_buf);
754 *pbitpos = bitpos; 626 *pbitpos = bitpos;
755 } 627 }
756 628
757 class CCodec_FaxEncoder {
758 public:
759 CCodec_FaxEncoder(const uint8_t* src_buf, int width, int height, int pitch);
760 ~CCodec_FaxEncoder();
761 void Encode(uint8_t*& dest_buf, FX_DWORD& dest_size);
762 void Encode2DLine(const uint8_t* scan_line);
763 CFX_BinaryBuf m_DestBuf;
764 uint8_t* m_pRefLine;
765 uint8_t* m_pLineBuf;
766 int m_Cols, m_Rows, m_Pitch;
767 const uint8_t* m_pSrcBuf;
768 };
769 CCodec_FaxEncoder::CCodec_FaxEncoder(const uint8_t* src_buf,
770 int width,
771 int height,
772 int pitch) {
773 m_pSrcBuf = src_buf;
774 m_Cols = width;
775 m_Rows = height;
776 m_Pitch = pitch;
777 m_pRefLine = FX_Alloc(uint8_t, m_Pitch);
778 FXSYS_memset(m_pRefLine, 0xff, m_Pitch);
779 m_pLineBuf = FX_Alloc2D(uint8_t, m_Pitch, 8);
780 m_DestBuf.EstimateSize(0, 10240);
781 }
782 CCodec_FaxEncoder::~CCodec_FaxEncoder() {
783 FX_Free(m_pRefLine);
784 FX_Free(m_pLineBuf);
785 }
786 void CCodec_FaxEncoder::Encode(uint8_t*& dest_buf, FX_DWORD& dest_size) {
787 int dest_bitpos = 0;
788 uint8_t last_byte = 0;
789 for (int i = 0; i < m_Rows; i++) {
790 const uint8_t* scan_line = m_pSrcBuf + i * m_Pitch;
791 FXSYS_memset(m_pLineBuf, 0, m_Pitch * 8);
792 m_pLineBuf[0] = last_byte;
793 FaxEncode2DLine(m_pLineBuf, dest_bitpos, scan_line, m_pRefLine, m_Cols);
794 m_DestBuf.AppendBlock(m_pLineBuf, dest_bitpos / 8);
795 last_byte = m_pLineBuf[dest_bitpos / 8];
796 dest_bitpos %= 8;
797 FXSYS_memcpy(m_pRefLine, scan_line, m_Pitch);
798 }
799 if (dest_bitpos) {
800 m_DestBuf.AppendByte(last_byte);
801 }
802 dest_buf = m_DestBuf.GetBuffer();
803 dest_size = m_DestBuf.GetSize();
804 m_DestBuf.DetachBuffer();
805 }
806 FX_BOOL CCodec_FaxModule::Encode(const uint8_t* src_buf,
807 int width,
808 int height,
809 int pitch,
810 uint8_t*& dest_buf,
811 FX_DWORD& dest_size) {
812 CCodec_FaxEncoder encoder(src_buf, width, height, pitch);
813 encoder.Encode(dest_buf, dest_size);
814 return TRUE;
815 }
816 ICodec_ScanlineDecoder* CCodec_FaxModule::CreateDecoder( 629 ICodec_ScanlineDecoder* CCodec_FaxModule::CreateDecoder(
817 const uint8_t* src_buf, 630 const uint8_t* src_buf,
818 FX_DWORD src_size, 631 FX_DWORD src_size,
819 int width, 632 int width,
820 int height, 633 int height,
821 int K, 634 int K,
822 FX_BOOL EndOfLine, 635 FX_BOOL EndOfLine,
823 FX_BOOL EncodedByteAlign, 636 FX_BOOL EncodedByteAlign,
824 FX_BOOL BlackIs1, 637 FX_BOOL BlackIs1,
825 int Columns, 638 int Columns,
826 int Rows) { 639 int Rows) {
827 CCodec_FaxDecoder* pDecoder = new CCodec_FaxDecoder; 640 CCodec_FaxDecoder* pDecoder = new CCodec_FaxDecoder;
828 pDecoder->Create(src_buf, src_size, width, height, K, EndOfLine, 641 pDecoder->Create(src_buf, src_size, width, height, K, EndOfLine,
829 EncodedByteAlign, BlackIs1, Columns, Rows); 642 EncodedByteAlign, BlackIs1, Columns, Rows);
830 return pDecoder; 643 return pDecoder;
831 } 644 }
OLDNEW
« no previous file with comments | « core/src/fxcodec/codec/fx_codec.cpp ('k') | core/src/fxcodec/codec/fx_codec_flate.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698