Add a WriteAppendRect() helper in cpdfsdk_appstream.cpp.

There are several instances of code that generate "append rect"
operators in cpdfsdk_appstream.cpp. Add a WriteAppendRect() function to
consolidate these similar instances.

Note that this is not a pure refactor, as some instances that
previously generated stream content of the form "4 5 6 7 re f" now
generate "4 5 6 7 re\nf" instead.

Change-Id: I80e6a4db81f4e0eb01b35285aede4b024d0148c7
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/96253
Reviewed-by: Nigi <nigi@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_appstream.cpp b/fpdfsdk/cpdfsdk_appstream.cpp
index 2857632..1336ec1 100644
--- a/fpdfsdk/cpdfsdk_appstream.cpp
+++ b/fpdfsdk/cpdfsdk_appstream.cpp
@@ -135,6 +135,11 @@
          << "\n";
 }
 
+void WriteAppendRect(fxcrt::ostringstream& stream, const CFX_FloatRect& rect) {
+  stream << rect.left << " " << rect.bottom << " " << rect.Width() << " "
+         << rect.Height() << " " << kAppendRectOperator << "\n";
+}
+
 ByteString GetStrokeColorAppStream(const CFX_Color& color) {
   fxcrt::ostringstream sColorStream;
   switch (color.nColorType) {
@@ -726,9 +731,8 @@
   fxcrt::ostringstream str;
   {
     AutoClosedQCommand q(&str);
-    str << rcPlate.left << " " << rcPlate.bottom << " " << rcPlate.Width()
-        << " " << rcPlate.Height() << " " << kAppendRectOperator << " "
-        << kSetNonZeroWindingClipOperator << " "
+    WriteAppendRect(str, rcPlate);
+    str << kSetNonZeroWindingClipOperator << " "
         << kEndPathNoFillOrStrokeOperator << "\n";
 
     str << scale.x << " 0 0 " << scale.y << " " << rcPlate.left + offset.x
@@ -928,9 +932,8 @@
   fxcrt::ostringstream sAppStream;
   {
     AutoClosedQCommand q(&sAppStream);
-    sAppStream << rcBBox.left << " " << rcBBox.bottom << " " << rcBBox.Width()
-               << " " << rcBBox.Height() << " " << kAppendRectOperator << " "
-               << kSetNonZeroWindingClipOperator << " "
+    WriteAppendRect(sAppStream, rcBBox);
+    sAppStream << kSetNonZeroWindingClipOperator << " "
                << kEndPathNoFillOrStrokeOperator << "\n";
     sAppStream << sTemp.str().c_str();
   }
@@ -962,12 +965,9 @@
         sColor = GetFillColorAppStream(color);
         if (sColor.GetLength() > 0) {
           sAppStream << sColor;
-          sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " "
-                     << fTop - fBottom << " " << kAppendRectOperator << "\n";
-          sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " "
-                     << fRight - fLeft - fWidth * 2 << " "
-                     << fTop - fBottom - fWidth * 2 << " "
-                     << kAppendRectOperator << "\n";
+          WriteAppendRect(sAppStream, {fLeft, fBottom, fRight, fTop});
+          WriteAppendRect(sAppStream, {fLeft + fWidth, fBottom + fWidth,
+                                       fRight - fWidth, fTop - fWidth});
           sAppStream << kFillEvenOddOperator << "\n";
         }
         break;
@@ -1020,13 +1020,10 @@
         sColor = GetFillColorAppStream(color);
         if (sColor.GetLength() > 0) {
           sAppStream << sColor;
-          sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " "
-                     << fTop - fBottom << " " << kAppendRectOperator << "\n";
-          sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " "
-                     << fRight - fLeft - fHalfWidth * 2 << " "
-                     << fTop - fBottom - fHalfWidth * 2 << " "
-                     << kAppendRectOperator << " " << kFillEvenOddOperator
-                     << "\n";
+          WriteAppendRect(sAppStream, {fLeft, fBottom, fRight, fTop});
+          WriteAppendRect(sAppStream, {fLeft + fHalfWidth, fBottom + fHalfWidth,
+                                       fRight - fHalfWidth, fTop - fHalfWidth});
+          sAppStream << kFillEvenOddOperator << "\n";
         }
         break;
       case BorderStyle::kUnderline:
@@ -1052,11 +1049,10 @@
   {
     AutoClosedQCommand q(&sAppStream);
     sAppStream << GetFillColorAppStream(
-                      CFX_Color(CFX_Color::Type::kRGB, 220.0f / 255.0f,
-                                220.0f / 255.0f, 220.0f / 255.0f))
-               << rcBBox.left << " " << rcBBox.bottom << " " << rcBBox.Width()
-               << " " << rcBBox.Height() << " " << kAppendRectOperator << " "
-               << kFillOperator << "\n";
+        CFX_Color(CFX_Color::Type::kRGB, 220.0f / 255.0f, 220.0f / 255.0f,
+                  220.0f / 255.0f));
+    WriteAppendRect(sAppStream, rcBBox);
+    sAppStream << kFillOperator << "\n";
   }
 
   {
@@ -1090,9 +1086,9 @@
   ByteString sColor = GetFillColorAppStream(color);
   if (sColor.GetLength() > 0) {
     AutoClosedQCommand q(&sAppStream);
-    sAppStream << sColor << rect.left << " " << rect.bottom << " "
-               << rect.Width() << " " << rect.Height() << " "
-               << kAppendRectOperator << " " << kFillOperator << "\n";
+    sAppStream << sColor;
+    WriteAppendRect(sAppStream, rect);
+    sAppStream << kFillOperator << "\n";
   }
 
   return ByteString(sAppStream);
@@ -1570,9 +1566,8 @@
 
     if (rcContent.Width() > rcEdit.Width() ||
         rcContent.Height() > rcEdit.Height()) {
-      sBody << rcEdit.left << " " << rcEdit.bottom << " " << rcEdit.Width()
-            << " " << rcEdit.Height() << " " << kAppendRectOperator << "\n"
-            << kSetNonZeroWindingClipOperator << "\n"
+      WriteAppendRect(sBody, rcEdit);
+      sBody << kSetNonZeroWindingClipOperator << "\n"
             << kEndPathNoFillOrStrokeOperator << "\n";
     }
 
@@ -1634,10 +1629,9 @@
       {
         AutoClosedQCommand q(&sList);
         sList << GetFillColorAppStream(CFX_Color(
-                     CFX_Color::Type::kRGB, 0, 51.0f / 255.0f, 113.0f / 255.0f))
-              << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width()
-              << " " << rcItem.Height() << " " << kAppendRectOperator << " "
-              << kFillOperator << "\n";
+            CFX_Color::Type::kRGB, 0, 51.0f / 255.0f, 113.0f / 255.0f));
+        WriteAppendRect(sList, rcItem);
+        sList << kFillOperator << "\n";
       }
 
       AutoClosedCommand bt(&sList, kTextBeginOperator, kTextEndOperator);
@@ -1660,9 +1654,8 @@
                           kMarkedSequenceEndOperator);
     AutoClosedQCommand q(&sBody);
 
-    sBody << rcClient.left << " " << rcClient.bottom << " " << rcClient.Width()
-          << " " << rcClient.Height() << " " << kAppendRectOperator << "\n"
-          << kSetNonZeroWindingClipOperator << "\n"
+    WriteAppendRect(sBody, rcClient);
+    sBody << kSetNonZeroWindingClipOperator << "\n"
           << kEndPathNoFillOrStrokeOperator << "\n"
           << sList.str();
   }
@@ -1748,10 +1741,8 @@
 
     if (rcContent.Width() > rcClient.Width() ||
         rcContent.Height() > rcClient.Height()) {
-      sBody << rcClient.left << " " << rcClient.bottom << " "
-            << rcClient.Width() << " " << rcClient.Height() << " "
-            << kAppendRectOperator << "\n"
-            << kSetNonZeroWindingClipOperator << "\n"
+      WriteAppendRect(sBody, rcClient);
+      sBody << kSetNonZeroWindingClipOperator << "\n"
             << kEndPathNoFillOrStrokeOperator << "\n";
     }
     CFX_Color crText = widget_->GetTextPWLColor();