Fix encoding problem in FPDFAnnot_SetAP().
BUG=pdfium:1212
Change-Id: I1266b04adc83179d453b6fc6c61f815cd7795cfe
Reviewed-on: https://pdfium-review.googlesource.com/c/47710
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp
index fa13c2c..8cd57f8 100644
--- a/fpdfsdk/fpdf_annot.cpp
+++ b/fpdfsdk/fpdf_annot.cpp
@@ -785,7 +785,7 @@
if (!pApDict)
pApDict = pAnnotDict->SetNewFor<CPDF_Dictionary>("AP");
- ByteString newValue = ByteStringFromFPDFWideString(value);
+ ByteString newValue = PDF_EncodeText(WideStringFromFPDFWideString(value));
auto pNewApStream = pdfium::MakeUnique<CPDF_Stream>();
pNewApStream->SetData(newValue.AsRawSpan());
pApDict->SetFor(modeKey, std::move(pNewApStream));
diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp
index 4c9a7f1..4e84d89 100644
--- a/fpdfsdk/fpdf_annot_embeddertest.cpp
+++ b/fpdfsdk/fpdf_annot_embeddertest.cpp
@@ -1579,6 +1579,30 @@
EXPECT_STREQ(kData, BufferToWString(buf).c_str());
}
+ {
+ ScopedFPDFAnnotation annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_STAMP));
+ ASSERT_TRUE(annot);
+ EXPECT_EQ(2, FPDFPage_GetAnnotCount(page));
+ EXPECT_EQ(FPDF_ANNOT_STAMP, FPDFAnnot_GetSubtype(annot.get()));
+ // Also do the same test for its appearance string.
+ std::fill(buf.begin(), buf.end(), 'x');
+ ASSERT_EQ(2u,
+ FPDFAnnot_GetAP(annot.get(), FPDF_ANNOT_APPEARANCEMODE_ROLLOVER,
+ buf.data(), buf.size()));
+ EXPECT_STREQ(L"", BufferToWString(buf).c_str());
+
+ std::unique_ptr<unsigned short, pdfium::FreeDeleter> text =
+ GetFPDFWideString(kData);
+ EXPECT_TRUE(FPDFAnnot_SetAP(annot.get(), FPDF_ANNOT_APPEARANCEMODE_ROLLOVER,
+ text.get()));
+
+ std::fill(buf.begin(), buf.end(), 'x');
+ ASSERT_EQ(6u,
+ FPDFAnnot_GetAP(annot.get(), FPDF_ANNOT_APPEARANCEMODE_ROLLOVER,
+ buf.data(), buf.size()));
+ EXPECT_STREQ(kData, BufferToWString(buf).c_str());
+ }
+
UnloadPage(page);
{
@@ -1589,7 +1613,7 @@
FPDF_PAGE saved_page = LoadSavedPage(0);
ASSERT_TRUE(saved_page);
- EXPECT_EQ(1, FPDFPage_GetAnnotCount(saved_page));
+ EXPECT_EQ(2, FPDFPage_GetAnnotCount(saved_page));
{
ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(saved_page, 0));
ASSERT_TRUE(annot);
@@ -1601,6 +1625,18 @@
EXPECT_STREQ(kData, BufferToWString(buf).c_str());
}
+ {
+ ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(saved_page, 0));
+ ASSERT_TRUE(annot);
+ // TODO(thestig): This return FPDF_ANNOT_UNKNOWN for some reason.
+ // EXPECT_EQ(FPDF_ANNOT_TEXT, FPDFAnnot_GetSubtype(annot.get()));
+
+ std::fill(buf.begin(), buf.end(), 'x');
+ ASSERT_EQ(6u, FPDFAnnot_GetStringValue(annot.get(), kTestKey, buf.data(),
+ buf.size()));
+ EXPECT_STREQ(kData, BufferToWString(buf).c_str());
+ }
+
CloseSavedPage(saved_page);
CloseSavedDocument();
}