[poppler] poppler/Annot.cc

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Mar 24 16:46:34 UTC 2022


 poppler/Annot.cc |  133 +++++++++++++++++++++++++++----------------------------
 1 file changed, 67 insertions(+), 66 deletions(-)

New commits:
commit cc16a3dfcab2ba93b62551ae6498333b1387b266
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Mar 24 17:25:58 2022 +0100

    More variable improvements in AnnotAppearanceBuilder::drawText

diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index 9fd6c871..b1fbb2dc 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -4305,13 +4305,11 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
     const bool forceZapfDingbats = flags & ForceZapfDingbatsDrawTextFlag;
 
     std::vector<GooString *> daToks;
-    GooString *tok;
     GooString convertedText;
     const GfxFont *font;
     double dx, dy;
-    double fontSize, borderWidth, x, xPrev, y, w, wMax;
-    int tfPos, tmPos, j;
-    int rot;
+    double fontSize;
+    int tfPos, tmPos;
     bool freeText = false; // true if text should be freed before return
     std::unique_ptr<const GfxFont> fontToFree = nullptr;
 
@@ -4328,9 +4326,8 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
                 ++i;
             }
             if (i < da->getLength()) {
-                for (j = i + 1; j < da->getLength() && !Lexer::isSpace(da->getChar(j)); ++j) {
-                    ;
-                }
+                int j;
+                for (j = i + 1; j < da->getLength() && !Lexer::isSpace(da->getChar(j)); ++j) { }
                 daToks.push_back(new GooString(da, i, j - i));
                 i = j;
             }
@@ -4348,7 +4345,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
     font = nullptr;
     fontSize = 0;
     if (tfPos >= 0) {
-        tok = daToks[tfPos];
+        GooString *tok = daToks[tfPos];
         if (forceZapfDingbats) {
             assert(xref != nullptr);
             if (tok->cmp("/ZaDb")) {
@@ -4386,7 +4383,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
     }
 
     // get the border width
-    borderWidth = border ? border->getWidth() : 0;
+    const double borderWidth = border ? border->getWidth() : 0;
 
     // for a password field, replace all characters with asterisks
     if (flags & TurnTextToStarsDrawTextFlag) {
@@ -4410,7 +4407,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
         appearBuf->append("/Tx BMC\n");
     }
     appearBuf->append("q\n");
-    rot = appearCharacs ? appearCharacs->getRotation() : 0;
+    const int rot = appearCharacs ? appearCharacs->getRotation() : 0;
     switch (rot) {
     case 90:
         appearBuf->appendf("0 1 -1 0 {0:.2f} 0 cm\n", rect->x2 - rect->x1);
@@ -4437,15 +4434,15 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
     if (flags & MultilineDrawTextFlag) {
         // note: comb is ignored in multiline mode as mentioned in the spec
 
-        wMax = dx - 2 * borderWidth - 4;
+        const double wMax = dx - 2 * borderWidth - 4;
 
         // compute font autosize
         if (fontSize == 0) {
             for (fontSize = 20; fontSize > 1; --fontSize) {
-                y = dy - 3;
+                double y = dy - 3;
                 int i = 0;
                 while (i < text->getLength()) {
-                    Annot::layoutText(text, &convertedText, &i, *font, &w, wMax / fontSize, nullptr, forceZapfDingbats);
+                    Annot::layoutText(text, &convertedText, &i, *font, nullptr, wMax / fontSize, nullptr, forceZapfDingbats);
                     y -= fontSize;
                 }
                 // approximate the descender for the last line
@@ -4454,7 +4451,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
                 }
             }
             if (tfPos >= 0) {
-                tok = daToks[tfPos + 1];
+                GooString *tok = daToks[tfPos + 1];
                 tok->clear();
                 tok->appendf("{0:.2f}", fontSize);
             }
@@ -4463,11 +4460,11 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
         // starting y coordinate
         // (note: each line of text starts with a Td operator that moves
         // down a line)
-        y = dy - 3;
+        const double y = dy - 3;
 
         // set the font matrix
         if (tmPos >= 0) {
-            tok = daToks[tmPos + 4];
+            GooString *tok = daToks[tmPos + 4];
             tok->clear();
             tok->append('0');
             tok = daToks[tmPos + 5];
@@ -4487,24 +4484,25 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
 
         // write a series of lines of text
         int i = 0;
-        xPrev = 0;
+        double xPrev = 0;
         while (i < text->getLength()) {
+            double w;
             Annot::layoutText(text, &convertedText, &i, *font, &w, wMax / fontSize, nullptr, forceZapfDingbats);
             w *= fontSize;
 
             // compute text start position
-            switch (quadding) {
-            case VariableTextQuadding::leftJustified:
-            default:
-                x = borderWidth + 2;
-                break;
-            case VariableTextQuadding::centered:
-                x = (dx - w) / 2;
-                break;
-            case VariableTextQuadding::rightJustified:
-                x = dx - borderWidth - 2 - w;
-                break;
-            }
+            auto calculateX = [quadding, borderWidth, dx, w] {
+                switch (quadding) {
+                case VariableTextQuadding::leftJustified:
+                default:
+                    return borderWidth + 2;
+                case VariableTextQuadding::centered:
+                    return (dx - w) / 2;
+                case VariableTextQuadding::rightJustified:
+                    return dx - borderWidth - 2 - w;
+                }
+            };
+            const double x = calculateX();
 
             // draw the line
             appearBuf->appendf("{0:.2f} {1:.2f} Td\n", x - xPrev, -fontSize);
@@ -4524,7 +4522,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
             int charCount;
 
             // compute comb spacing
-            w = (dx - 2 * borderWidth) / combMaxLen;
+            const double w = (dx - 2 * borderWidth) / combMaxLen;
 
             // compute font autosize
             if (fontSize == 0) {
@@ -4534,7 +4532,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
                 }
                 fontSize = floor(fontSize);
                 if (tfPos >= 0) {
-                    tok = daToks[tfPos + 1];
+                    GooString *tok = daToks[tfPos + 1];
                     tok->clear();
                     tok->appendf("{0:.2f}", fontSize);
                 }
@@ -4547,23 +4545,23 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
             }
 
             // compute starting text cell
-            switch (quadding) {
-            case VariableTextQuadding::leftJustified:
-            default:
-                x = borderWidth;
-                break;
-            case VariableTextQuadding::centered:
-                x = borderWidth + (combMaxLen - charCount) / 2.0 * w;
-                break;
-            case VariableTextQuadding::rightJustified:
-                x = borderWidth + (combMaxLen - charCount) * w;
-                break;
-            }
-            y = 0.5 * dy - 0.4 * fontSize;
+            auto calculateX = [quadding, borderWidth, combMaxLen, charCount, w] {
+                switch (quadding) {
+                case VariableTextQuadding::leftJustified:
+                default:
+                    return borderWidth;
+                case VariableTextQuadding::centered:
+                    return borderWidth + (combMaxLen - charCount) / 2.0 * w;
+                case VariableTextQuadding::rightJustified:
+                    return borderWidth + (combMaxLen - charCount) * w;
+                }
+            };
+            const double x = calculateX();
+            const double y = 0.5 * dy - 0.4 * fontSize;
 
             // set the font matrix
             if (tmPos >= 0) {
-                tok = daToks[tmPos + 4];
+                GooString *tok = daToks[tmPos + 4];
                 tok->clear();
                 tok->appendf("{0:.2f}", x);
                 tok = daToks[tmPos + 5];
@@ -4585,7 +4583,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
             const char *s = convertedText.c_str();
             int len = convertedText.getLength();
             int i = 0;
-            xPrev = w; // so that first character is placed properly
+            double xPrev = w; // so that first character is placed properly
             while (i < combMaxLen && len > 0) {
                 CharCode code;
                 const Unicode *uAux;
@@ -4599,8 +4597,8 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
                 // center each character within its cell, by advancing the text
                 // position the appropriate amount relative to the start of the
                 // previous character
-                x = 0.5 * (w - char_dx);
-                appearBuf->appendf("{0:.2f} 0 Td\n", x - xPrev + w);
+                const double combX = 0.5 * (w - char_dx);
+                appearBuf->appendf("{0:.2f} 0 Td\n", combX - xPrev + w);
 
                 GooString charBuf(s, n);
                 writeString(charBuf.toStr());
@@ -4609,12 +4607,13 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
                 i++;
                 s += n;
                 len -= n;
-                xPrev = x;
+                xPrev = combX;
             }
 
             // regular (non-comb) formatting
         } else {
             int ii = 0;
+            double w;
             Annot::layoutText(text, &convertedText, &ii, *font, &w, 0.0, nullptr, forceZapfDingbats);
 
             // compute font autosize
@@ -4628,7 +4627,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
                 }
                 fontSize = floor(fontSize);
                 if (tfPos >= 0) {
-                    tok = daToks[tfPos + 1];
+                    GooString *tok = daToks[tfPos + 1];
                     tok->clear();
                     tok->appendf("{0:.2f}", fontSize);
                 }
@@ -4636,23 +4635,23 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
 
             // compute text start position
             w *= fontSize;
-            switch (quadding) {
-            case VariableTextQuadding::leftJustified:
-            default:
-                x = borderWidth + 2;
-                break;
-            case VariableTextQuadding::centered:
-                x = (dx - w) / 2;
-                break;
-            case VariableTextQuadding::rightJustified:
-                x = dx - borderWidth - 2 - w;
-                break;
-            }
-            y = 0.5 * dy - 0.4 * fontSize;
+            auto calculateX = [quadding, borderWidth, dx, w] {
+                switch (quadding) {
+                case VariableTextQuadding::leftJustified:
+                default:
+                    return borderWidth + 2;
+                case VariableTextQuadding::centered:
+                    return (dx - w) / 2;
+                case VariableTextQuadding::rightJustified:
+                    return dx - borderWidth - 2 - w;
+                }
+            };
+            const double x = calculateX();
+            const double y = 0.5 * dy - 0.4 * fontSize;
 
             // set the font matrix
             if (tmPos >= 0) {
-                tok = daToks[tmPos + 4];
+                GooString *tok = daToks[tmPos + 4];
                 tok->clear();
                 tok->appendf("{0:.2f}", x);
                 tok = daToks[tmPos + 5];
@@ -4699,7 +4698,7 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con
     GooString *tok;
     GooString convertedText;
     const GfxFont *font;
-    double fontSize, borderWidth, x, y, w, wMax;
+    double fontSize, borderWidth, x, y;
     int tfPos, tmPos, i, j;
     std::unique_ptr<const GfxFont> fontToFree;
 
@@ -4771,7 +4770,7 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con
 
     // compute font autosize
     if (fontSize == 0) {
-        wMax = 0;
+        double wMax = 0;
         for (i = 0; i < fieldChoice->getNumChoices(); ++i) {
             j = 0;
             if (fieldChoice->getChoice(i) == nullptr) {
@@ -4781,6 +4780,7 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con
                 }
                 return false;
             }
+            double w;
             Annot::layoutText(fieldChoice->getChoice(i), &convertedText, &j, *font, &w, 0.0, nullptr, false);
             if (w > wMax) {
                 wMax = w;
@@ -4815,6 +4815,7 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con
 
         // compute text width and start position
         j = 0;
+        double w;
         Annot::layoutText(fieldChoice->getChoice(i), &convertedText, &j, *font, &w, 0.0, nullptr, false);
         w *= fontSize;
         switch (quadding) {


More information about the poppler mailing list