Fix rendering of text annotations with custom fonts. When https://pdfium-review.googlesource.com/91290 fixed a bug with annotations, it introduced another. Now CPDFSDK_AppStream creates a new stream, but the new stream is missing resources. Fix this by copying the resources from the original stream. Add a pixel test to illustrate this issue. Bug: chromium:1308739 Change-Id: I756d72e96e79025f78e52a6f2cf2b1142bce6ea1 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/91670 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_appstream.cpp b/fpdfsdk/cpdfsdk_appstream.cpp index 2edbc21..e349205 100644 --- a/fpdfsdk/cpdfsdk_appstream.cpp +++ b/fpdfsdk/cpdfsdk_appstream.cpp
@@ -1855,8 +1855,11 @@ // If `pStream` is created by CreateModifiedAPStream(), then it is safe to // edit, as it is not shared. CPDF_Stream* pStream = pParentDict->GetStreamFor(key); + CPDF_Dictionary* pOrigStreamDict = nullptr; CPDF_Document* doc = widget_->GetPageView()->GetPDFDocument(); if (!doc->IsModifiedAPStream(pStream)) { + if (pStream) + pOrigStreamDict = pStream->GetDict(); pStream = doc->CreateModifiedAPStream(); pParentDict->SetNewFor<CPDF_Reference>(key, doc, pStream->GetObjNum()); } @@ -1869,6 +1872,13 @@ pStreamDict->SetNewFor<CPDF_Name>("Type", "XObject"); pStreamDict->SetNewFor<CPDF_Name>("Subtype", "Form"); pStreamDict->SetNewFor<CPDF_Number>("FormType", 1); + + if (pOrigStreamDict) { + CPDF_Dictionary* pResources = pOrigStreamDict->GetDictFor("Resources"); + if (pResources) + pStreamDict->SetFor("Resources", pResources->Clone()); + } + pStream->InitStream({}, std::move(pNewDict)); } pStreamDict->SetMatrixFor("Matrix", widget_->GetMatrix());
diff --git a/testing/resources/pixel/text_form_custom_font.in b/testing/resources/pixel/text_form_custom_font.in new file mode 100644 index 0000000..af404e4 --- /dev/null +++ b/testing/resources/pixel/text_form_custom_font.in
@@ -0,0 +1,81 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R + /AcroForm << + /DR << + /Font << + /TT0 5 0 R + >> + >> + /Fields [4 0 R] + >> +>> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /Annots [4 0 R] + /MediaBox [0 0 200 200] +>> +endobj +{{object 4 0}} << + /Type /Annot + /Subtype /Widget + /FT /Tx + /DA (1 0 0 rg /TT0 16 Tf) + /Rect [50 100 150 130] + /T (Text Box) + /V ( ) +>> +endobj +{{object 5 0}} << + /Type /Font + /Subtype /TrueType + /FirstChar 32 + /BaseFont /AAAAAD+Test + /FontDescriptor 6 0 R + /ToUnicode 7 0 R + /LastChar 32 + /Widths [1055] +>> +endobj +{{object 6 0}} << + /Type /FontDescriptor + /Descent -68 + /MissingWidth 1000 + /CapHeight 1149 + /StemV 0 + /FontFile2 8 0 R + /Flags 4 + /FontBBox [0 -215 1000 932] + /FontName /AAAAAD+Test + /ItalicAngle 0 + /Ascent 933 +>> +endobj +{{object 7 0}} << + {{streamlen}} +>> +stream +{{include ../bug_1388_cmap.fragment}} +endstream +endobj +{{object 8 0}} << + /Filter [/ASCIIHexDecode /FlateDecode] + {{streamlen}} +>> +stream +{{include ../bug_1388_truetype_font.fragment}} +endstream +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF
diff --git a/testing/resources/pixel/text_form_custom_font_expected.pdf.0.png b/testing/resources/pixel/text_form_custom_font_expected.pdf.0.png new file mode 100644 index 0000000..3894ad5 --- /dev/null +++ b/testing/resources/pixel/text_form_custom_font_expected.pdf.0.png Binary files differ
diff --git a/testing/resources/pixel/text_form_custom_font_expected_mac.pdf.0.png b/testing/resources/pixel/text_form_custom_font_expected_mac.pdf.0.png new file mode 100644 index 0000000..01b3dbf --- /dev/null +++ b/testing/resources/pixel/text_form_custom_font_expected_mac.pdf.0.png Binary files differ
diff --git a/testing/resources/pixel/text_form_custom_font_expected_skia.pdf.0.png b/testing/resources/pixel/text_form_custom_font_expected_skia.pdf.0.png new file mode 100644 index 0000000..5f898f8 --- /dev/null +++ b/testing/resources/pixel/text_form_custom_font_expected_skia.pdf.0.png Binary files differ