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 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 {
... ...