Commit ebacc77d9dff624d6e9a92fd20dc8055791596b6
1 parent
efc70b47
Refactor `TfFinder` class for improved readability and maintainability
Streamlined method definitions, replaced explicit loop counters with range-based loops, and added `final` specifier to class and methods to ensure overriding restrictions. Simplified constructor and member variable initialization.
Showing
1 changed file
with
67 additions
and
72 deletions
libqpdf/QPDFFormFieldObjectHelper.cc
| ... | ... | @@ -655,15 +655,76 @@ ValueSetter::writeAppearance() |
| 655 | 655 | |
| 656 | 656 | namespace |
| 657 | 657 | { |
| 658 | - class TfFinder: public QPDFObjectHandle::TokenFilter | |
| 658 | + class TfFinder final: public QPDFObjectHandle::TokenFilter | |
| 659 | 659 | { |
| 660 | 660 | public: |
| 661 | 661 | TfFinder() = default; |
| 662 | - ~TfFinder() override = default; | |
| 663 | - void handleToken(QPDFTokenizer::Token const&) override; | |
| 664 | - double getTf(); | |
| 665 | - std::string getFontName(); | |
| 666 | - std::string getDA(); | |
| 662 | + ~TfFinder() final = default; | |
| 663 | + | |
| 664 | + void | |
| 665 | + handleToken(QPDFTokenizer::Token const& token) final | |
| 666 | + { | |
| 667 | + auto ttype = token.getType(); | |
| 668 | + auto const& value = token.getValue(); | |
| 669 | + DA.emplace_back(token.getRawValue()); | |
| 670 | + switch (ttype) { | |
| 671 | + case QPDFTokenizer::tt_integer: | |
| 672 | + case QPDFTokenizer::tt_real: | |
| 673 | + last_num = strtod(value.c_str(), nullptr); | |
| 674 | + last_num_idx = QIntC::to_int(DA.size() - 1); | |
| 675 | + break; | |
| 676 | + | |
| 677 | + case QPDFTokenizer::tt_name: | |
| 678 | + last_name = value; | |
| 679 | + break; | |
| 680 | + | |
| 681 | + case QPDFTokenizer::tt_word: | |
| 682 | + if (token.isWord("Tf")) { | |
| 683 | + if ((last_num > 1.0) && (last_num < 1000.0)) { | |
| 684 | + // These ranges are arbitrary but keep us from doing insane things or | |
| 685 | + // suffering from over/underflow | |
| 686 | + tf = last_num; | |
| 687 | + } | |
| 688 | + tf_idx = last_num_idx; | |
| 689 | + font_name = last_name; | |
| 690 | + } | |
| 691 | + break; | |
| 692 | + | |
| 693 | + default: | |
| 694 | + break; | |
| 695 | + } | |
| 696 | + } | |
| 697 | + | |
| 698 | + double | |
| 699 | + getTf() const | |
| 700 | + { | |
| 701 | + return tf; | |
| 702 | + } | |
| 703 | + std::string | |
| 704 | + getFontName() const | |
| 705 | + { | |
| 706 | + return font_name; | |
| 707 | + } | |
| 708 | + | |
| 709 | + std::string | |
| 710 | + getDA() | |
| 711 | + { | |
| 712 | + std::string result; | |
| 713 | + int i = -1; | |
| 714 | + for (auto const& cur: DA) { | |
| 715 | + if (++i == tf_idx) { | |
| 716 | + double delta = strtod(cur.c_str(), nullptr) - tf; | |
| 717 | + if (delta > 0.001 || delta < -0.001) { | |
| 718 | + // tf doesn't match the font size passed to Tf, so substitute. | |
| 719 | + QTC::TC("qpdf", "QPDFFormFieldObjectHelper fallback Tf"); | |
| 720 | + result += QUtil::double_to_string(tf); | |
| 721 | + continue; | |
| 722 | + } | |
| 723 | + } | |
| 724 | + result += cur; | |
| 725 | + } | |
| 726 | + return result; | |
| 727 | + } | |
| 667 | 728 | |
| 668 | 729 | private: |
| 669 | 730 | double tf{11.0}; |
| ... | ... | @@ -676,72 +737,6 @@ namespace |
| 676 | 737 | }; |
| 677 | 738 | } // namespace |
| 678 | 739 | |
| 679 | -void | |
| 680 | -TfFinder::handleToken(QPDFTokenizer::Token const& token) | |
| 681 | -{ | |
| 682 | - QPDFTokenizer::token_type_e ttype = token.getType(); | |
| 683 | - std::string value = token.getValue(); | |
| 684 | - DA.push_back(token.getRawValue()); | |
| 685 | - switch (ttype) { | |
| 686 | - case QPDFTokenizer::tt_integer: | |
| 687 | - case QPDFTokenizer::tt_real: | |
| 688 | - last_num = strtod(value.c_str(), nullptr); | |
| 689 | - last_num_idx = QIntC::to_int(DA.size() - 1); | |
| 690 | - break; | |
| 691 | - | |
| 692 | - case QPDFTokenizer::tt_name: | |
| 693 | - last_name = value; | |
| 694 | - break; | |
| 695 | - | |
| 696 | - case QPDFTokenizer::tt_word: | |
| 697 | - if (token.isWord("Tf")) { | |
| 698 | - if ((last_num > 1.0) && (last_num < 1000.0)) { | |
| 699 | - // These ranges are arbitrary but keep us from doing insane things or suffering from | |
| 700 | - // over/underflow | |
| 701 | - tf = last_num; | |
| 702 | - } | |
| 703 | - tf_idx = last_num_idx; | |
| 704 | - font_name = last_name; | |
| 705 | - } | |
| 706 | - break; | |
| 707 | - | |
| 708 | - default: | |
| 709 | - break; | |
| 710 | - } | |
| 711 | -} | |
| 712 | - | |
| 713 | -double | |
| 714 | -TfFinder::getTf() | |
| 715 | -{ | |
| 716 | - return tf; | |
| 717 | -} | |
| 718 | - | |
| 719 | -std::string | |
| 720 | -TfFinder::getDA() | |
| 721 | -{ | |
| 722 | - std::string result; | |
| 723 | - size_t n = DA.size(); | |
| 724 | - for (size_t i = 0; i < n; ++i) { | |
| 725 | - std::string cur = DA.at(i); | |
| 726 | - if (QIntC::to_int(i) == tf_idx) { | |
| 727 | - double delta = strtod(cur.c_str(), nullptr) - tf; | |
| 728 | - if ((delta > 0.001) || (delta < -0.001)) { | |
| 729 | - // tf doesn't match the font size passed to Tf, so substitute. | |
| 730 | - QTC::TC("qpdf", "QPDFFormFieldObjectHelper fallback Tf"); | |
| 731 | - cur = QUtil::double_to_string(tf); | |
| 732 | - } | |
| 733 | - } | |
| 734 | - result += cur; | |
| 735 | - } | |
| 736 | - return result; | |
| 737 | -} | |
| 738 | - | |
| 739 | -std::string | |
| 740 | -TfFinder::getFontName() | |
| 741 | -{ | |
| 742 | - return font_name; | |
| 743 | -} | |
| 744 | - | |
| 745 | 740 | QPDFObjectHandle |
| 746 | 741 | QPDFFormFieldObjectHelper::getFontFromResource(QPDFObjectHandle resources, std::string const& name) |
| 747 | 742 | { | ... | ... |