Commit ebacc77d9dff624d6e9a92fd20dc8055791596b6

Authored by m-holger
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.
libqpdf/QPDFFormFieldObjectHelper.cc
@@ -655,15 +655,76 @@ ValueSetter::writeAppearance() @@ -655,15 +655,76 @@ ValueSetter::writeAppearance()
655 655
656 namespace 656 namespace
657 { 657 {
658 - class TfFinder: public QPDFObjectHandle::TokenFilter 658 + class TfFinder final: public QPDFObjectHandle::TokenFilter
659 { 659 {
660 public: 660 public:
661 TfFinder() = default; 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 private: 729 private:
669 double tf{11.0}; 730 double tf{11.0};
@@ -676,72 +737,6 @@ namespace @@ -676,72 +737,6 @@ namespace
676 }; 737 };
677 } // namespace 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 QPDFObjectHandle 740 QPDFObjectHandle
746 QPDFFormFieldObjectHelper::getFontFromResource(QPDFObjectHandle resources, std::string const& name) 741 QPDFFormFieldObjectHelper::getFontFromResource(QPDFObjectHandle resources, std::string const& name)
747 { 742 {