From e2cea87df5105cb7d749595af6ad519d9fb5403a Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Mon, 12 Oct 2026 09:56:58 -0700 Subject: [PATCH 01/37] Use nullptr instead of FooPtr() Make it more obvious the code is instantiating a null FooPtr. Change-Id: Ief54445d91ecc0b90a65009429289455ff1c5bab Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160490 Reviewed-by: Tom Sepez Commit-Queue: Lei Zhang --- core/fpdfapi/parser/cpdf_dictionary.cpp | 5 ++--- core/fpdfapi/parser/cpdf_parser.cpp | 2 +- core/fxge/renderdevicedriver_iface.cpp | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp index de35427745..f0a52e9bfa 100644 --- a/core/fpdfapi/parser/cpdf_dictionary.cpp +++ b/core/fpdfapi/parser/cpdf_dictionary.cpp @@ -22,8 +22,7 @@ #include "core/fxcrt/containers/contains.h" #include "core/fxcrt/fx_stream.h" -CPDF_Dictionary::CPDF_Dictionary() - : CPDF_Dictionary(WeakPtr()) {} +CPDF_Dictionary::CPDF_Dictionary() : CPDF_Dictionary(nullptr) {} CPDF_Dictionary::CPDF_Dictionary(const WeakPtr& pPool) : pool_(pPool) {} @@ -305,7 +304,7 @@ RetainPtr CPDF_Dictionary::RemoveFor(ByteStringView key) { CHECK(!IsLocked()); auto it = map_.find(key); if (it == map_.end()) { - return RetainPtr(); + return nullptr; } auto node = map_.extract(it); return std::move(node.mapped()); diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp index 6f89380920..7644124d69 100644 --- a/core/fpdfapi/parser/cpdf_parser.cpp +++ b/core/fpdfapi/parser/cpdf_parser.cpp @@ -1049,7 +1049,7 @@ uint32_t CPDF_Parser::GetTrailerObjectNumber() const { RetainPtr CPDF_Parser::GetCombinedTrailer() const { return cross_ref_table_->trailer() ? ToDictionary(cross_ref_table_->trailer()->Clone()) - : RetainPtr(); + : nullptr; } uint32_t CPDF_Parser::GetInfoObjNum() const { diff --git a/core/fxge/renderdevicedriver_iface.cpp b/core/fxge/renderdevicedriver_iface.cpp index f9523853b1..2cbeb67133 100644 --- a/core/fxge/renderdevicedriver_iface.cpp +++ b/core/fxge/renderdevicedriver_iface.cpp @@ -89,7 +89,7 @@ bool RenderDeviceDriverIface::GetDIBits(RetainPtr bitmap, } RetainPtr RenderDeviceDriverIface::GetBackDrop() const { - return RetainPtr(); + return nullptr; } bool RenderDeviceDriverIface::ContinueDIBits(Continuation* continuation, From 1e1e501df0930e8c3c2f438040b93cef878764b4 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Mon, 12 Oct 2026 10:08:21 -0700 Subject: [PATCH 02/37] Use MaybeOwned in CPDF_Parser Avoid manually reimplementing it. Change-Id: I3a5510221a3ee1575e994aacec42d75f7cc6b221 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160491 Reviewed-by: Tom Sepez Commit-Queue: Lei Zhang --- core/fpdfapi/parser/cpdf_parser.cpp | 9 ++++----- core/fpdfapi/parser/cpdf_parser.h | 5 ++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp index 7644124d69..025b184cc9 100644 --- a/core/fpdfapi/parser/cpdf_parser.cpp +++ b/core/fpdfapi/parser/cpdf_parser.cpp @@ -165,8 +165,7 @@ CPDF_Parser::CPDF_Parser(ParsedObjectsHolder* holder) : objects_holder_(holder), cross_ref_table_(std::make_unique()) { if (!holder) { - owned_objects_holder_ = std::make_unique(); - objects_holder_ = owned_objects_holder_.get(); + objects_holder_ = std::make_unique(); } } @@ -1099,7 +1098,7 @@ RetainPtr CPDF_Parser::ParseIndirectObject(uint32_t objnum) { if (!obj_stream) { return nullptr; } - return obj_stream->ParseObject(objects_holder_, objnum, + return obj_stream->ParseObject(objects_holder_.Get(), objnum, info->archive.obj_index); } } @@ -1149,7 +1148,7 @@ RetainPtr CPDF_Parser::ParseIndirectObjectAt(FX_FILESIZE pos, syntax_->SetPos(pos); auto result = syntax_->GetIndirectObject( - objects_holder_, CPDF_SyntaxParser::ParseType::kLoose); + objects_holder_.Get(), CPDF_SyntaxParser::ParseType::kLoose); syntax_->SetPos(saved_pos); if (result && objnum && result->GetObjNum() != objnum) { return nullptr; @@ -1183,7 +1182,7 @@ RetainPtr CPDF_Parser::LoadTrailer() { return nullptr; } - return ToDictionary(syntax_->GetObjectBody(objects_holder_)); + return ToDictionary(syntax_->GetObjectBody(objects_holder_.Get())); } uint32_t CPDF_Parser::GetPermissions(bool get_owner_perms) const { diff --git a/core/fpdfapi/parser/cpdf_parser.h b/core/fpdfapi/parser/cpdf_parser.h index 76cfa70806..6edbd72540 100644 --- a/core/fpdfapi/parser/cpdf_parser.h +++ b/core/fpdfapi/parser/cpdf_parser.h @@ -20,8 +20,8 @@ #include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" #include "core/fxcrt/bytestring.h" #include "core/fxcrt/fx_types.h" +#include "core/fxcrt/maybe_owned.h" #include "core/fxcrt/retain_ptr.h" -#include "core/fxcrt/unowned_ptr.h" class CPDF_Array; class CPDF_Dictionary; @@ -189,8 +189,7 @@ class CPDF_Parser { void SetPassword(const ByteString& password) { password_ = password; } std::unique_ptr syntax_; - std::unique_ptr owned_objects_holder_; - UnownedPtr objects_holder_; + MaybeOwned objects_holder_; bool has_parsed_ = false; bool xref_stream_ = false; From 56c5b9701cd7bbf3db4d65d7fb3f9b9e54a1d533 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Mon, 12 Oct 2026 11:25:09 -0700 Subject: [PATCH 03/37] Remove the ability to intern strings from CPDF_String Adding arbitrary string data to the ByteStringPool from CPDF_String is unlikely to generate much data sharing. Instead, only use ByteStringPool for CPDF_Name, where values like "Type" and "Page" are often repeated. Change-Id: I261b16b93a9a180c86e6c78b1dfd92a5d7bd1097 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160492 Reviewed-by: Tom Sepez Commit-Queue: Lei Zhang --- core/fpdfapi/page/cpdf_streamparser.cpp | 4 ++-- core/fpdfapi/parser/cpdf_object.h | 3 +-- .../parser/cpdf_object_avail_unittest.cpp | 20 ++++++++---------- core/fpdfapi/parser/cpdf_object_unittest.cpp | 8 +++---- .../cpdf_page_object_avail_unittest.cpp | 3 +-- core/fpdfapi/parser/cpdf_string.cpp | 21 +++++-------------- core/fpdfapi/parser/cpdf_string.h | 10 +++------ core/fpdfapi/parser/cpdf_syntax_parser.cpp | 4 ++-- .../parser/fpdf_parser_decode_unittest.cpp | 2 +- core/fpdfdoc/cpdf_filespec_unittest.cpp | 2 +- core/fpdfdoc/cpdf_formfield_unittest.cpp | 6 +++--- 11 files changed, 31 insertions(+), 52 deletions(-) diff --git a/core/fpdfapi/page/cpdf_streamparser.cpp b/core/fpdfapi/page/cpdf_streamparser.cpp index 89cd925105..f440e7e962 100644 --- a/core/fpdfapi/page/cpdf_streamparser.cpp +++ b/core/fpdfapi/page/cpdf_streamparser.cpp @@ -409,12 +409,12 @@ RetainPtr CPDF_StreamParser::ReadLeafObject() { } if (first_char == '(') { - return pdfium::MakeRetain(pool_, ReadString()); + return pdfium::MakeRetain(ReadString()); } if (first_char == '<') { CHECK_EQ(word_size_, 1); // Caller handled all other cases. - return pdfium::MakeRetain(pool_, ReadHexString(), + return pdfium::MakeRetain(ReadHexString(), CPDF_String::DataType::kIsHex); } diff --git a/core/fpdfapi/parser/cpdf_object.h b/core/fpdfapi/parser/cpdf_object.h index 8de91f6441..674a9682e0 100644 --- a/core/fpdfapi/parser/cpdf_object.h +++ b/core/fpdfapi/parser/cpdf_object.h @@ -162,8 +162,7 @@ template struct CanInternStrings { static constexpr bool value = std::is_same::value || std::is_same::value || - std::is_same::value || - std::is_same::value; + std::is_same::value; }; #endif // CORE_FPDFAPI_PARSER_CPDF_OBJECT_H_ diff --git a/core/fpdfapi/parser/cpdf_object_avail_unittest.cpp b/core/fpdfapi/parser/cpdf_object_avail_unittest.cpp index 0c19c79cb7..cd75175614 100644 --- a/core/fpdfapi/parser/cpdf_object_avail_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_object_avail_unittest.cpp @@ -119,7 +119,7 @@ class CPDF_ObjectAvailExcludeTypeKey final : public CPDF_ObjectAvail { TEST(ObjectAvailTest, OneObject) { TestHolder holder; - holder.AddObject(1, pdfium::MakeRetain(nullptr, "string"), + holder.AddObject(1, pdfium::MakeRetain("string"), TestHolder::ObjectState::Unavailable); CPDF_ObjectAvail avail(holder.GetValidator(), &holder, 1); EXPECT_EQ(CPDF_DataAvail::kDataNotAvailable, avail.CheckAvail()); @@ -131,7 +131,7 @@ TEST(ObjectAvailTest, OneReferencedObject) { TestHolder holder; holder.AddObject(1, pdfium::MakeRetain(&holder, 2), TestHolder::ObjectState::Unavailable); - holder.AddObject(2, pdfium::MakeRetain(nullptr, "string"), + holder.AddObject(2, pdfium::MakeRetain("string"), TestHolder::ObjectState::Unavailable); CPDF_ObjectAvail avail(holder.GetValidator(), &holder, 1); EXPECT_EQ(CPDF_DataAvail::kDataNotAvailable, avail.CheckAvail()); @@ -235,9 +235,8 @@ TEST(ObjectAvailTest, Exclude) { 2); // Add string, which is refered by array item. It is should not be checked. - holder.AddObject( - 3, pdfium::MakeRetain(nullptr, "Not available string"), - TestHolder::ObjectState::Unavailable); + holder.AddObject(3, pdfium::MakeRetain("Not available string"), + TestHolder::ObjectState::Unavailable); CPDF_ObjectAvailExcludeArray avail(holder.GetValidator(), &holder, 1); EXPECT_EQ(CPDF_DataAvail::kDataAvailable, avail.CheckAvail()); } @@ -254,16 +253,15 @@ TEST(ObjectAvailTest, ReadErrorOnExclude) { holder.GetTestObject(2)->GetMutableDict()->SetNewFor( "Type", &holder, 3); // The value of "Type" key is not available at start - holder.AddObject(3, pdfium::MakeRetain(nullptr, "Exclude me"), + holder.AddObject(3, pdfium::MakeRetain("Exclude me"), TestHolder::ObjectState::Unavailable); holder.GetTestObject(2)->GetMutableDict()->SetNewFor( "OtherData", &holder, 4); // Add string, which is referred by dictionary item. It is should not be // checked, because the dictionary with it, should be skipped. - holder.AddObject( - 4, pdfium::MakeRetain(nullptr, "Not available string"), - TestHolder::ObjectState::Unavailable); + holder.AddObject(4, pdfium::MakeRetain("Not available string"), + TestHolder::ObjectState::Unavailable); CPDF_ObjectAvailExcludeTypeKey avail(holder.GetValidator(), &holder, 1); @@ -291,7 +289,7 @@ TEST(ObjectAvailTest, IgnoreNotExistsObject) { TEST(ObjectAvailTest, CheckTwice) { TestHolder holder; - holder.AddObject(1, pdfium::MakeRetain(nullptr, "string"), + holder.AddObject(1, pdfium::MakeRetain("string"), TestHolder::ObjectState::Unavailable); CPDF_ObjectAvail avail(holder.GetValidator(), &holder, 1); @@ -313,7 +311,7 @@ TEST(ObjectAvailTest, SelfReferedInlinedObject) { "Dict"); root->SetNewFor("Self", &holder, 1); - holder.AddObject(2, pdfium::MakeRetain(nullptr, "Data"), + holder.AddObject(2, pdfium::MakeRetain("Data"), TestHolder::ObjectState::Unavailable); CPDF_ObjectAvail avail(holder.GetValidator(), &holder, root); diff --git a/core/fpdfapi/parser/cpdf_object_unittest.cpp b/core/fpdfapi/parser/cpdf_object_unittest.cpp index 2aed796907..3d3780ae4b 100644 --- a/core/fpdfapi/parser/cpdf_object_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_object_unittest.cpp @@ -60,9 +60,8 @@ class PDFObjectsTest : public testing::Test { auto number_int_obj = pdfium::MakeRetain(1245); auto number_float_obj = pdfium::MakeRetain(9.00345f); // String objects. - auto str_reg_obj = - pdfium::MakeRetain(nullptr, L"A simple test"); - auto str_spec_obj = pdfium::MakeRetain(nullptr, L"\t\n"); + auto str_reg_obj = pdfium::MakeRetain(L"A simple test"); + auto str_spec_obj = pdfium::MakeRetain(L"\t\n"); // Name object. auto name_obj = pdfium::MakeRetain(nullptr, "space"); // Array object. @@ -809,8 +808,7 @@ TEST(PDFArrayTest, AddReferenceAndGetObjectAt) { auto boolean_obj = pdfium::MakeRetain(true); auto int_obj = pdfium::MakeRetain(-1234); auto float_obj = pdfium::MakeRetain(2345.089f); - auto str_obj = - pdfium::MakeRetain(nullptr, "Adsfdsf 343434 %&&*\n"); + auto str_obj = pdfium::MakeRetain("Adsfdsf 343434 %&&*\n"); auto name_obj = pdfium::MakeRetain(nullptr, "Title:"); auto null_obj = pdfium::MakeRetain(); auto indirect_objs = std::to_array>( diff --git a/core/fpdfapi/parser/cpdf_page_object_avail_unittest.cpp b/core/fpdfapi/parser/cpdf_page_object_avail_unittest.cpp index 57e7ae2ad5..2a499bfd7a 100644 --- a/core/fpdfapi/parser/cpdf_page_object_avail_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_page_object_avail_unittest.cpp @@ -105,8 +105,7 @@ TEST(PageObjectAvailTest, ExcludePages) { holder.GetTestObject(3)->GetMutableDict()->SetNewFor( "OtherPageData", &holder, 4); // Add unavailable object related to other page. - holder.AddObject(4, - pdfium::MakeRetain(nullptr, "Other page data"), + holder.AddObject(4, pdfium::MakeRetain("Other page data"), TestHolder::ObjectState::Unavailable); CPDF_PageObjectAvail avail(holder.GetValidator(), &holder, 1); diff --git a/core/fpdfapi/parser/cpdf_string.cpp b/core/fpdfapi/parser/cpdf_string.cpp index 8bdba046ce..3d429e3dff 100644 --- a/core/fpdfapi/parser/cpdf_string.cpp +++ b/core/fpdfapi/parser/cpdf_string.cpp @@ -17,24 +17,13 @@ CPDF_String::CPDF_String() = default; -CPDF_String::CPDF_String(WeakPtr pool, - pdfium::span data, - DataType is_hex) - : data_(ByteStringView(data)), output_is_hex_(true) { - if (pool) { - data_ = pool->Intern(data_); - } -} +CPDF_String::CPDF_String(pdfium::span data, DataType is_hex) + : data_(ByteStringView(data)), output_is_hex_(true) {} -CPDF_String::CPDF_String(WeakPtr pool, const ByteString& str) - : data_(str) { - if (pool) { - data_ = pool->Intern(data_); - } -} +CPDF_String::CPDF_String(const ByteString& str) : data_(str) {} -CPDF_String::CPDF_String(WeakPtr pool, WideStringView str) - : CPDF_String(pool, PDF_EncodeText(str)) { +CPDF_String::CPDF_String(WideStringView str) + : CPDF_String(PDF_EncodeText(str)) { // Delegates to ctor above. } diff --git a/core/fpdfapi/parser/cpdf_string.h b/core/fpdfapi/parser/cpdf_string.h index 0c5a73e4e4..d3fff80a89 100644 --- a/core/fpdfapi/parser/cpdf_string.h +++ b/core/fpdfapi/parser/cpdf_string.h @@ -8,11 +8,9 @@ #define CORE_FPDFAPI_PARSER_CPDF_STRING_H_ #include "core/fpdfapi/parser/cpdf_object.h" -#include "core/fxcrt/bytestring_pool.h" #include "core/fxcrt/fx_string.h" #include "core/fxcrt/retain_ptr.h" #include "core/fxcrt/span.h" -#include "core/fxcrt/weak_ptr.h" class CPDF_String final : public CPDF_Object { public: @@ -36,11 +34,9 @@ class CPDF_String final : public CPDF_Object { private: CPDF_String(); - CPDF_String(WeakPtr pool, - pdfium::span data, - DataType is_hex); - CPDF_String(WeakPtr pool, const ByteString& str); - CPDF_String(WeakPtr pool, WideStringView str); + CPDF_String(pdfium::span data, DataType is_hex); + explicit CPDF_String(const ByteString& str); + explicit CPDF_String(WideStringView str); ~CPDF_String() override; ByteString data_; diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp index ee91e039bc..0b256a34be 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp +++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp @@ -579,10 +579,10 @@ RetainPtr CPDF_SyntaxParser::GetObjectBodyInternal( } if (word == "(") { - return pdfium::MakeRetain(pool_, ReadString()); + return pdfium::MakeRetain(ReadString()); } if (word == "<") { - return pdfium::MakeRetain(pool_, ReadHexString(), + return pdfium::MakeRetain(ReadHexString(), CPDF_String::DataType::kIsHex); } if (word == "[") { diff --git a/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp b/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp index ee7ec3b37f..110eaa703d 100644 --- a/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp +++ b/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp @@ -176,7 +176,7 @@ TEST(ParserDecodeTest, ValidateDecoderPipelineWithIndirectObjects) { { // Invalid 2 decoder pipeline due to wrong type indirect object. CPDF_IndirectObjectHolder objects_holder; - auto decoder = pdfium::MakeRetain(nullptr, "FlateDecode"); + auto decoder = pdfium::MakeRetain("FlateDecode"); uint32_t decoder_number = objects_holder.AddIndirectObject(std::move(decoder)); diff --git a/core/fpdfdoc/cpdf_filespec_unittest.cpp b/core/fpdfdoc/cpdf_filespec_unittest.cpp index 2b12dbf45d..4ddbc93c5b 100644 --- a/core/fpdfdoc/cpdf_filespec_unittest.cpp +++ b/core/fpdfdoc/cpdf_filespec_unittest.cpp @@ -70,7 +70,7 @@ TEST(CPDFFileSpecTest, GetFileName) { L"/docs/test.pdf", L"/docs/test.pdf" #endif }; - auto str_obj = pdfium::MakeRetain(nullptr, test_data.input); + auto str_obj = pdfium::MakeRetain(test_data.input); CPDF_FileSpec file_spec(str_obj); EXPECT_EQ(test_data.expected, file_spec.GetFileName()); } diff --git a/core/fpdfdoc/cpdf_formfield_unittest.cpp b/core/fpdfdoc/cpdf_formfield_unittest.cpp index 6b31dfa8a4..91562b6f30 100644 --- a/core/fpdfdoc/cpdf_formfield_unittest.cpp +++ b/core/fpdfdoc/cpdf_formfield_unittest.cpp @@ -127,7 +127,7 @@ TEST(CPDFFormFieldTest, IsItemSelected) { } { // Values (/V) object is just a string. - auto values = pdfium::MakeRetain(/*pPool=*/nullptr, L"Gamma"); + auto values = pdfium::MakeRetain(L"Gamma"); std::vector expected_indices{2}; std::vector excluded_indices{-1, 5}; TestMultiselectFieldDict(opt_array, values, /*selected_indices=*/nullptr, @@ -136,7 +136,7 @@ TEST(CPDFFormFieldTest, IsItemSelected) { } { // Values (/V) object is just an invalid string. - auto values = pdfium::MakeRetain(/*pPool=*/nullptr, L"Omega"); + auto values = pdfium::MakeRetain(L"Omega"); std::vector expected_indices; std::vector excluded_indices{-1, 5}; TestMultiselectFieldDict(opt_array, values, /*selected_indices=*/nullptr, @@ -325,7 +325,7 @@ TEST(CPDFFormFieldTest, IsItemSelected) { { // Values (/V) or Selected Indices (/I) objects conflict with each not being // an array. - auto values = pdfium::MakeRetain(/*pPool=*/nullptr, L"Gamma"); + auto values = pdfium::MakeRetain(L"Gamma"); auto selected_indices = pdfium::MakeRetain(4); std::vector expected_indices{2}; std::vector excluded_indices{-1, 5}; From f871ae47922d76d668c4eec99b9dba3e6ffd9c38 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Mon, 12 Oct 2026 11:33:41 -0700 Subject: [PATCH 04/37] Change ByteStringPool to use absl::flat_hash_set Per recommendations in Chromium's base/containers/README.md, switch from std::unordered_set to absl::flat_hash_set. Change-Id: I0e4dfeea9fe888b0ea2765afa42d165bc69e2e4f Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160493 Commit-Queue: Lei Zhang Reviewed-by: Tom Sepez --- core/fxcrt/bytestring_pool.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/fxcrt/bytestring_pool.h b/core/fxcrt/bytestring_pool.h index 97223be3fa..fec36cd53d 100644 --- a/core/fxcrt/bytestring_pool.h +++ b/core/fxcrt/bytestring_pool.h @@ -7,9 +7,8 @@ #ifndef CORE_FXCRT_BYTESTRING_POOL_H_ #define CORE_FXCRT_BYTESTRING_POOL_H_ -#include - #include "core/fxcrt/bytestring.h" +#include "third_party/abseil-cpp/absl/container/flat_hash_set.h" namespace fxcrt { @@ -21,7 +20,7 @@ class ByteStringPool { ByteString Intern(const ByteString& str); private: - std::unordered_set pool_; + absl::flat_hash_set pool_; }; } // namespace fxcrt From c31605b51cc8bd6ad8379db338d756c87b10b9ee Mon Sep 17 00:00:00 2001 From: Frank Barchard Date: Mon, 12 Oct 2026 16:35:33 -0700 Subject: [PATCH 05/37] Use libyuv for DIB format, alpha, and transforms When PDF_USE_LIBYUV is enabled, accelerate lossless pixel format conversions, alpha plane extraction/injection, horizontal mirroring, and 90/270-degree rotation / transposition in CFX_DIBBase and CFX_DIBitmap: - ConvertBuffer_RgbToArgbPremul, CFX_DIBitmap::ConvertFormat (kBgr -> kBgra), and 24-bpp CFX_DIBBase::RealizeSkImage: use libyuv::RGB24ToARGB. - ConvertBuffer_32bppRgbToRgb24: use libyuv::ARGBToRGB24. - CFX_DIBBase::CloneAlphaMask: use libyuv::ARGBExtractAlpha. - CFX_DIBitmap::MultiplyAlphaMask (kBgrx): use libyuv::ARGBCopyYToAlpha. - CFX_DIBBase::FlipImage: use libyuv::MirrorPlane, libyuv::RGB24Mirror, and libyuv::ARGBMirror. - CFX_DIBBase::SwapXY: use libyuv::RotatePlane90, libyuv::RotatePlane270, libyuv::TransposePlane, and libyuv::ARGBRotate for 8-bpp and 32-bpp bitmaps via RealizeIfNeeded(). When the source bitmap has a contiguous buffer, invoke the full 2D libyuv plane functions directly instead of row-by-row. Speedup vs Before (1275x1650, US Letter 150 DPI): | Function | Zen 5 | GNR | Grace | Wasm | RVV | |------------------|--------|--------|--------|--------|--------| | RGB24ToARGB | 6.08x | 2.53x | 5.65x | 5.54x | 31.04x | | ARGBToRGB24 | 5.88x | 1.98x | 2.35x | 1.55x | 28.07x | | ARGBExtractAlpha | 5.95x | 1.90x | 4.13x | 4.33x | 17.05x | | ARGBCopyYToAlpha | 7.61x | 3.02x | 4.71x | 3.28x | 7.22x | | MirrorPlane | 9.59x | 5.28x | 5.84x | 6.04x | 1.33x | | RGB24Mirror | 8.32x | 3.02x | 5.40x | 4.53x | 1.00x | | ARGBMirror | 4.17x | 1.33x | 2.57x | 3.20x | 21.06x | | RotatePlane90 | 10.86x | 6.60x | 7.23x | 8.50x | 1.84x | | RotatePlane270 | 10.75x | 6.59x | 6.97x | 9.31x | 1.84x | | TransposePlane | 10.92x | 6.53x | 7.13x | 8.64x | 1.84x | | ARGBRotate | 5.40x | 3.01x | 1.65x | 2.74x | 13.24x | (Zen 5: AMD EPYC Turin AVX-512; GNR: Intel Granite Rapids AVX-512; Grace: NVIDIA Grace Neoverse V2 SVE2; Wasm: V8 SIMD128; RVV: Coral NPU) Bug: 42271060, 549230311 Change-Id: I223e13be29cb4546c7d0e53c9dda340dc4375944 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160093 Reviewed-by: Lei Zhang Commit-Queue: Lei Zhang --- core/fxge/DEPS | 7 +- core/fxge/dib/cfx_dibbase.cpp | 160 ++++++++++++++++++++++-- core/fxge/dib/cfx_dibbase.h | 6 +- core/fxge/dib/cfx_dibbase_unittest.cpp | 151 ++++++++++++++++++++++ core/fxge/dib/cfx_dibitmap.cpp | 40 ++++-- core/fxge/dib/cfx_dibitmap.h | 4 +- core/fxge/dib/cfx_dibitmap_unittest.cpp | 50 ++++++++ core/fxge/skia/cfx_dibbase_skia.cpp | 53 ++++++++ 8 files changed, 440 insertions(+), 31 deletions(-) diff --git a/core/fxge/DEPS b/core/fxge/DEPS index 81e9c22f12..a25eb15df4 100644 --- a/core/fxge/DEPS +++ b/core/fxge/DEPS @@ -1,10 +1,5 @@ include_rules = [ + '+third_party/libyuv/include', '+third_party/rust', '+third_party/skia/include', ] - -specific_include_rules = { - "cfx_scanlinecompositor\.cpp": [ - '+third_party/libyuv/include/libyuv/convert_argb.h', - ], -} diff --git a/core/fxge/dib/cfx_dibbase.cpp b/core/fxge/dib/cfx_dibbase.cpp index e945f07066..cfa77d7f9e 100644 --- a/core/fxge/dib/cfx_dibbase.cpp +++ b/core/fxge/dib/cfx_dibbase.cpp @@ -29,6 +29,14 @@ #include "core/fxge/dib/cfx_imagestretcher.h" #include "core/fxge/dib/cfx_imagetransformer.h" +#if defined(PDF_USE_LIBYUV) +#include "third_party/libyuv/include/libyuv/convert_argb.h" +#include "third_party/libyuv/include/libyuv/convert_from_argb.h" +#include "third_party/libyuv/include/libyuv/planar_functions.h" +#include "third_party/libyuv/include/libyuv/rotate.h" +#include "third_party/libyuv/include/libyuv/rotate_argb.h" +#endif + namespace { #if defined(PDF_USE_SKIA) @@ -40,6 +48,23 @@ void ConvertBuffer_RgbToArgbPremul( const RetainPtr& src_bitmap, int src_left, int src_top) { +#if defined(PDF_USE_LIBYUV) + if (!src_bitmap->GetBuffer().empty()) { + const uint8_t* src_buf = src_bitmap->GetScanline(src_top) + .subspan(Fx2DSizeOrDie(src_left, 3)) + .data(); + libyuv::RGB24ToARGB(src_buf, src_bitmap->GetPitch(), dest_buf.data(), + dest_pitch, width, height); + return; + } + + for (int row = 0; row < height; ++row) { + auto dest_span = dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)); + auto src_span = src_bitmap->GetScanline(src_top + row) + .subspan(Fx2DSizeOrDie(src_left, 3)); + libyuv::RGB24ToARGB(src_span.data(), 0, dest_span.data(), 0, width, 1); + } +#else for (int row = 0; row < height; ++row) { auto dest_span = fxcrt::reinterpret_span>( dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch))); @@ -57,6 +82,7 @@ void ConvertBuffer_RgbToArgbPremul( output.alpha = 255; } } +#endif } void ConvertBuffer_ArgbPremulToRgb( @@ -462,11 +488,24 @@ void ConvertBuffer_32bppRgbToRgb24( int src_left, int src_top) { const size_t x_offset = Fx2DSizeOrDie(src_left, 4); +#if defined(PDF_USE_LIBYUV) + if (!pSrcBitmap->GetBuffer().empty()) { + const uint8_t* src_buf = + pSrcBitmap->GetScanline(src_top).subspan(x_offset).data(); + libyuv::ARGBToRGB24(src_buf, pSrcBitmap->GetPitch(), dest_buf.data(), + dest_pitch, width, height); + return; + } +#endif + for (int row = 0; row < height; ++row) { uint8_t* dest_scan = dest_buf.subspan(Fx2DSizeOrDie(row, dest_pitch)).data(); const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row).subspan(x_offset).data(); +#if defined(PDF_USE_LIBYUV) + libyuv::ARGBToRGB24(src_scan, 0, dest_scan, 0, width, 1); +#else UNSAFE_TODO({ for (int col = 0; col < width; ++col) { FXSYS_memcpy(dest_scan, src_scan, 3); @@ -474,6 +513,7 @@ void ConvertBuffer_32bppRgbToRgb24( src_scan += 4; } }); +#endif } } @@ -613,6 +653,10 @@ CFX_DIBBase::CFX_DIBBase() = default; CFX_DIBBase::~CFX_DIBBase() = default; +pdfium::span CFX_DIBBase::GetBuffer() const { + return pdfium::span(); +} + bool CFX_DIBBase::SkipToScanline(int line, PauseIndicatorIface* pPause) const { return false; } @@ -621,7 +665,7 @@ size_t CFX_DIBBase::GetEstimatedImageMemoryBurden() const { return GetRequiredPaletteSize() * sizeof(uint32_t); } -#if BUILDFLAG(IS_WIN) || defined(PDF_USE_SKIA) +#if BUILDFLAG(IS_WIN) || defined(PDF_USE_SKIA) || defined(PDF_USE_LIBYUV) RetainPtr CFX_DIBBase::RealizeIfNeeded() const { return Realize(); } @@ -901,7 +945,21 @@ RetainPtr CFX_DIBBase::CloneAlphaMask() const { return nullptr; } +#if defined(PDF_USE_LIBYUV) + if (!GetBuffer().empty()) { + libyuv::ARGBExtractAlpha(GetBuffer().data(), GetPitch(), + pMask->GetWritableBuffer().data(), + pMask->GetPitch(), GetWidth(), GetHeight()); + return pMask; + } +#endif + for (int row = 0; row < GetHeight(); ++row) { +#if defined(PDF_USE_LIBYUV) + libyuv::ARGBExtractAlpha(GetScanline(row).data(), 0, + pMask->GetWritableScanline(row).data(), 0, + GetWidth(), 1); +#else const uint8_t* src_scan = GetScanline(row).subspan<3u>().data(); uint8_t* dest_scan = pMask->GetWritableScanline(row).data(); UNSAFE_TODO({ @@ -910,6 +968,7 @@ RetainPtr CFX_DIBBase::CloneAlphaMask() const { src_scan += 4; } }); +#endif } return pMask; } @@ -956,12 +1015,25 @@ RetainPtr CFX_DIBBase::FlipImage(bool bXFlip, bool bYFlip) const { } if (bytes_per_pixel == 1) { +#if defined(PDF_USE_LIBYUV) + if (!GetBuffer().empty()) { + libyuv::MirrorPlane(GetBuffer().data(), GetPitch(), + pFlipped->GetWritableBuffer().data(), + pFlipped->GetPitch(), GetWidth(), + bYFlip ? -GetHeight() : GetHeight()); + return pFlipped; + } +#endif + for (int row = 0; row < GetHeight(); ++row) { + const uint8_t* src_scan = GetScanline(row).data(); + uint8_t* dest_scan = + pFlipped->GetWritableScanline(bYFlip ? GetHeight() - row - 1 : row) + .data(); +#if defined(PDF_USE_LIBYUV) + libyuv::MirrorPlane(src_scan, 0, dest_scan, 0, GetWidth(), 1); +#else UNSAFE_TODO({ - const uint8_t* src_scan = GetScanline(row).data(); - uint8_t* dest_scan = - pFlipped->GetWritableScanline(bYFlip ? GetHeight() - row - 1 : row) - .data(); dest_scan += (GetWidth() - 1) * bytes_per_pixel; for (int col = 0; col < GetWidth(); ++col) { *dest_scan = *src_scan; @@ -969,17 +1041,31 @@ RetainPtr CFX_DIBBase::FlipImage(bool bXFlip, bool bYFlip) const { ++src_scan; } }); +#endif } return pFlipped; } if (bytes_per_pixel == 3) { +#if defined(PDF_USE_LIBYUV) + if (!GetBuffer().empty()) { + libyuv::RGB24Mirror(GetBuffer().data(), GetPitch(), + pFlipped->GetWritableBuffer().data(), + pFlipped->GetPitch(), GetWidth(), + bYFlip ? -GetHeight() : GetHeight()); + return pFlipped; + } +#endif + for (int row = 0; row < GetHeight(); ++row) { + const uint8_t* src_scan = GetScanline(row).data(); + uint8_t* dest_scan = + pFlipped->GetWritableScanline(bYFlip ? GetHeight() - row - 1 : row) + .data(); +#if defined(PDF_USE_LIBYUV) + libyuv::RGB24Mirror(src_scan, 0, dest_scan, 0, GetWidth(), 1); +#else UNSAFE_TODO({ - const uint8_t* src_scan = GetScanline(row).data(); - uint8_t* dest_scan = - pFlipped->GetWritableScanline(bYFlip ? GetHeight() - row - 1 : row) - .data(); dest_scan += (GetWidth() - 1) * bytes_per_pixel; for (int col = 0; col < GetWidth(); ++col) { FXSYS_memcpy(dest_scan, src_scan, 3); @@ -987,17 +1073,30 @@ RetainPtr CFX_DIBBase::FlipImage(bool bXFlip, bool bYFlip) const { src_scan += 3; } }); +#endif } return pFlipped; } CHECK_EQ(bytes_per_pixel, 4); +#if defined(PDF_USE_LIBYUV) + if (!GetBuffer().empty()) { + libyuv::ARGBMirror( + GetBuffer().data(), GetPitch(), pFlipped->GetWritableBuffer().data(), + pFlipped->GetPitch(), GetWidth(), bYFlip ? -GetHeight() : GetHeight()); + return pFlipped; + } +#endif + for (int row = 0; row < GetHeight(); ++row) { + const uint8_t* src_scan = GetScanline(row).data(); + uint8_t* dest_scan = + pFlipped->GetWritableScanline(bYFlip ? GetHeight() - row - 1 : row) + .data(); +#if defined(PDF_USE_LIBYUV) + libyuv::ARGBMirror(src_scan, 0, dest_scan, 0, GetWidth(), 1); +#else UNSAFE_TODO({ - const uint8_t* src_scan = GetScanline(row).data(); - uint8_t* dest_scan = - pFlipped->GetWritableScanline(bYFlip ? GetHeight() - row - 1 : row) - .data(); dest_scan += (GetWidth() - 1) * bytes_per_pixel; for (int col = 0; col < GetWidth(); ++col) { const auto* src_scan32 = reinterpret_cast(src_scan); @@ -1007,6 +1106,7 @@ RetainPtr CFX_DIBBase::FlipImage(bool bXFlip, bool bYFlip) const { src_scan += 4; } }); +#endif } return pFlipped; } @@ -1080,6 +1180,40 @@ RetainPtr CFX_DIBBase::SwapXY(bool bXFlip, bool bYFlip) const { } const int bytes_per_pixel = GetBPP() / 8; +#if defined(PDF_USE_LIBYUV) + if (bytes_per_pixel == 1 || bytes_per_pixel == 4) { + RetainPtr realized = RealizeIfNeeded(); + if (realized) { + const uint8_t* src_buf = realized->GetBuffer().data(); + const int src_pitch = realized->GetPitch(); + uint8_t* dst_buf = dest_span.data(); + if (bytes_per_pixel == 1) { + if (bXFlip && bYFlip) { + libyuv::RotatePlane270(realized->GetScanline(GetHeight() - 1).data(), + -src_pitch, dst_buf, dest_pitch, GetWidth(), + GetHeight()); + } else if (bXFlip) { + libyuv::RotatePlane90(src_buf, src_pitch, dst_buf, dest_pitch, + GetWidth(), GetHeight()); + } else if (bYFlip) { + libyuv::RotatePlane270(src_buf, src_pitch, dst_buf, dest_pitch, + GetWidth(), GetHeight()); + } else { + libyuv::TransposePlane(src_buf, src_pitch, dst_buf, dest_pitch, + GetWidth(), GetHeight()); + } + return pTransBitmap; + } + if (libyuv::ARGBRotate( + src_buf, src_pitch, dst_buf, dest_pitch, GetWidth(), + bXFlip == bYFlip ? -GetHeight() : GetHeight(), + bYFlip ? libyuv::kRotate270 : libyuv::kRotate90) == 0) { + return pTransBitmap; + } + } + } +#endif + int dest_step = bYFlip ? -dest_pitch : dest_pitch; if (bytes_per_pixel == 3) { dest_step -= 2; diff --git a/core/fxge/dib/cfx_dibbase.h b/core/fxge/dib/cfx_dibbase.h index 0227867771..99d7224b88 100644 --- a/core/fxge/dib/cfx_dibbase.h +++ b/core/fxge/dib/cfx_dibbase.h @@ -44,11 +44,15 @@ class CFX_DIBBase : public Retainable { static constexpr uint32_t kPaletteSize = 256; + // Returns an empty buffer if there is no data, or if the DIB is not backed by + // a contiguous buffer. In the latter case, the caller should use + // GetScanline(). + virtual pdfium::span GetBuffer() const; // Note that the returned scanline includes unused space at the end, if any. virtual pdfium::span GetScanline(int line) const = 0; virtual bool SkipToScanline(int line, PauseIndicatorIface* pPause) const; virtual size_t GetEstimatedImageMemoryBurden() const; -#if BUILDFLAG(IS_WIN) || defined(PDF_USE_SKIA) +#if BUILDFLAG(IS_WIN) || defined(PDF_USE_SKIA) || defined(PDF_USE_LIBYUV) // Calls Realize() if needed. Otherwise, return `this`. virtual RetainPtr RealizeIfNeeded() const; #endif diff --git a/core/fxge/dib/cfx_dibbase_unittest.cpp b/core/fxge/dib/cfx_dibbase_unittest.cpp index b0ba4ce1d3..4b422f2479 100644 --- a/core/fxge/dib/cfx_dibbase_unittest.cpp +++ b/core/fxge/dib/cfx_dibbase_unittest.cpp @@ -163,3 +163,154 @@ TEST(CFXDIBBaseTest, GetOverlapRectBadInputs) { RunOverlapRectTest(bitmap.Get(), input, /*expected_output=*/nullptr); } } + +TEST(CFXDIBBaseTest, SwapXY8Bpp) { + auto src = pdfium::MakeRetain(); + ASSERT_TRUE(src->Create(3, 2, FXDIB_Format::k8bppMask)); + auto row0 = src->GetWritableScanline(0); + row0[0] = 10; + row0[1] = 20; + row0[2] = 30; + auto row1 = src->GetWritableScanline(1); + row1[0] = 40; + row1[1] = 50; + row1[2] = 60; + + auto ff = src->SwapXY(false, false); + ASSERT_TRUE(ff); + ASSERT_EQ(2, ff->GetWidth()); + ASSERT_EQ(3, ff->GetHeight()); + EXPECT_EQ(10u, ff->GetScanline(0)[0]); + EXPECT_EQ(40u, ff->GetScanline(0)[1]); + EXPECT_EQ(20u, ff->GetScanline(1)[0]); + EXPECT_EQ(50u, ff->GetScanline(1)[1]); + EXPECT_EQ(30u, ff->GetScanline(2)[0]); + EXPECT_EQ(60u, ff->GetScanline(2)[1]); + + auto tf = src->SwapXY(true, false); + ASSERT_TRUE(tf); + ASSERT_EQ(2, tf->GetWidth()); + ASSERT_EQ(3, tf->GetHeight()); + EXPECT_EQ(40u, tf->GetScanline(0)[0]); + EXPECT_EQ(10u, tf->GetScanline(0)[1]); + EXPECT_EQ(50u, tf->GetScanline(1)[0]); + EXPECT_EQ(20u, tf->GetScanline(1)[1]); + EXPECT_EQ(60u, tf->GetScanline(2)[0]); + EXPECT_EQ(30u, tf->GetScanline(2)[1]); + + auto ft = src->SwapXY(false, true); + ASSERT_TRUE(ft); + ASSERT_EQ(2, ft->GetWidth()); + ASSERT_EQ(3, ft->GetHeight()); + EXPECT_EQ(30u, ft->GetScanline(0)[0]); + EXPECT_EQ(60u, ft->GetScanline(0)[1]); + EXPECT_EQ(20u, ft->GetScanline(1)[0]); + EXPECT_EQ(50u, ft->GetScanline(1)[1]); + EXPECT_EQ(10u, ft->GetScanline(2)[0]); + EXPECT_EQ(40u, ft->GetScanline(2)[1]); + + auto tt = src->SwapXY(true, true); + ASSERT_TRUE(tt); + ASSERT_EQ(2, tt->GetWidth()); + ASSERT_EQ(3, tt->GetHeight()); + EXPECT_EQ(60u, tt->GetScanline(0)[0]); + EXPECT_EQ(30u, tt->GetScanline(0)[1]); + EXPECT_EQ(50u, tt->GetScanline(1)[0]); + EXPECT_EQ(20u, tt->GetScanline(1)[1]); + EXPECT_EQ(40u, tt->GetScanline(2)[0]); + EXPECT_EQ(10u, tt->GetScanline(2)[1]); +} + +TEST(CFXDIBBaseTest, SwapXY32Bpp) { + auto src = pdfium::MakeRetain(); + ASSERT_TRUE(src->Create(3, 2, FXDIB_Format::kBgra)); + auto row0 = src->GetWritableScanlineAs(0); + row0[0] = 0x11223301u; + row0[1] = 0x11223302u; + row0[2] = 0x11223303u; + auto row1 = src->GetWritableScanlineAs(1); + row1[0] = 0x44556604u; + row1[1] = 0x44556605u; + row1[2] = 0x44556606u; + + auto ff = src->SwapXY(false, false); + ASSERT_TRUE(ff); + ASSERT_EQ(2, ff->GetWidth()); + ASSERT_EQ(3, ff->GetHeight()); + EXPECT_EQ(0x11223301u, ff->GetScanlineAs(0)[0]); + EXPECT_EQ(0x44556604u, ff->GetScanlineAs(0)[1]); + EXPECT_EQ(0x11223302u, ff->GetScanlineAs(1)[0]); + EXPECT_EQ(0x44556605u, ff->GetScanlineAs(1)[1]); + EXPECT_EQ(0x11223303u, ff->GetScanlineAs(2)[0]); + EXPECT_EQ(0x44556606u, ff->GetScanlineAs(2)[1]); + + auto tf = src->SwapXY(true, false); + ASSERT_TRUE(tf); + ASSERT_EQ(2, tf->GetWidth()); + ASSERT_EQ(3, tf->GetHeight()); + EXPECT_EQ(0x44556604u, tf->GetScanlineAs(0)[0]); + EXPECT_EQ(0x11223301u, tf->GetScanlineAs(0)[1]); + EXPECT_EQ(0x44556605u, tf->GetScanlineAs(1)[0]); + EXPECT_EQ(0x11223302u, tf->GetScanlineAs(1)[1]); + EXPECT_EQ(0x44556606u, tf->GetScanlineAs(2)[0]); + EXPECT_EQ(0x11223303u, tf->GetScanlineAs(2)[1]); + + auto ft = src->SwapXY(false, true); + ASSERT_TRUE(ft); + ASSERT_EQ(2, ft->GetWidth()); + ASSERT_EQ(3, ft->GetHeight()); + EXPECT_EQ(0x11223303u, ft->GetScanlineAs(0)[0]); + EXPECT_EQ(0x44556606u, ft->GetScanlineAs(0)[1]); + EXPECT_EQ(0x11223302u, ft->GetScanlineAs(1)[0]); + EXPECT_EQ(0x44556605u, ft->GetScanlineAs(1)[1]); + EXPECT_EQ(0x11223301u, ft->GetScanlineAs(2)[0]); + EXPECT_EQ(0x44556604u, ft->GetScanlineAs(2)[1]); + + auto tt = src->SwapXY(true, true); + ASSERT_TRUE(tt); + ASSERT_EQ(2, tt->GetWidth()); + ASSERT_EQ(3, tt->GetHeight()); + EXPECT_EQ(0x44556606u, tt->GetScanlineAs(0)[0]); + EXPECT_EQ(0x11223303u, tt->GetScanlineAs(0)[1]); + EXPECT_EQ(0x44556605u, tt->GetScanlineAs(1)[0]); + EXPECT_EQ(0x11223302u, tt->GetScanlineAs(1)[1]); + EXPECT_EQ(0x44556604u, tt->GetScanlineAs(2)[0]); + EXPECT_EQ(0x11223301u, tt->GetScanlineAs(2)[1]); +} + +TEST(CFXDIBBaseTest, CloneAlphaMask) { + auto src = pdfium::MakeRetain(); + ASSERT_TRUE(src->Create(2, 1, FXDIB_Format::kBgra)); + auto row = src->GetWritableScanlineAs>(0); + row[0] = {1, 2, 3, 0xaa}; + row[1] = {4, 5, 6, 0x55}; + + auto mask = src->CloneAlphaMask(); + ASSERT_TRUE(mask); + ASSERT_EQ(2, mask->GetWidth()); + ASSERT_EQ(1, mask->GetHeight()); + EXPECT_EQ(FXDIB_Format::k8bppMask, mask->GetFormat()); + EXPECT_EQ(0xaau, mask->GetScanline(0)[0]); + EXPECT_EQ(0x55u, mask->GetScanline(0)[1]); +} + +TEST(CFXDIBBaseTest, ConvertToBgrFromBgra) { + auto src = pdfium::MakeRetain(); + ASSERT_TRUE(src->Create(2, 1, FXDIB_Format::kBgra)); + auto row = src->GetWritableScanlineAs>(0); + row[0] = {10, 20, 30, 0x80}; + row[1] = {40, 50, 60, 0xff}; + + auto bgr = src->ConvertTo(FXDIB_Format::kBgr); + ASSERT_TRUE(bgr); + ASSERT_EQ(2, bgr->GetWidth()); + ASSERT_EQ(1, bgr->GetHeight()); + EXPECT_EQ(FXDIB_Format::kBgr, bgr->GetFormat()); + auto bgr_row = bgr->GetScanlineAs>(0); + EXPECT_EQ(10u, bgr_row[0].blue); + EXPECT_EQ(20u, bgr_row[0].green); + EXPECT_EQ(30u, bgr_row[0].red); + EXPECT_EQ(40u, bgr_row[1].blue); + EXPECT_EQ(50u, bgr_row[1].green); + EXPECT_EQ(60u, bgr_row[1].red); +} diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp index f98cb981ae..4836116712 100644 --- a/core/fxge/dib/cfx_dibitmap.cpp +++ b/core/fxge/dib/cfx_dibitmap.cpp @@ -28,6 +28,11 @@ #include "core/fxge/cfx_gemodule.h" #include "core/fxge/dib/cfx_scanlinecompositor.h" +#if defined(PDF_USE_LIBYUV) +#include "third_party/libyuv/include/libyuv/convert_argb.h" +#include "third_party/libyuv/include/libyuv/planar_functions.h" +#endif + namespace { size_t GetAllocSizeOrZero(uint32_t size) { @@ -126,7 +131,7 @@ size_t CFX_DIBitmap::GetEstimatedImageMemoryBurden() const { return result; } -#if BUILDFLAG(IS_WIN) || defined(PDF_USE_SKIA) +#if BUILDFLAG(IS_WIN) || defined(PDF_USE_SKIA) || defined(PDF_USE_LIBYUV) RetainPtr CFX_DIBitmap::RealizeIfNeeded() const { if (GetBuffer().empty()) { return Realize(); @@ -347,6 +352,12 @@ bool CFX_DIBitmap::MultiplyAlphaMask(RetainPtr mask) { if (GetFormat() == FXDIB_Format::kBgrx) { // TODO(crbug.com/42271020): Consider adding support for // `FXDIB_Format::kBgraPremul` +#if defined(PDF_USE_LIBYUV) + SetFormat(FXDIB_Format::kBgra); + libyuv::ARGBCopyYToAlpha(mask->GetBuffer().data(), mask->GetPitch(), + GetWritableBuffer().data(), GetPitch(), GetWidth(), + GetHeight()); +#else if (!ConvertFormat(FXDIB_Format::kBgra)) { return false; } @@ -363,6 +374,7 @@ bool CFX_DIBitmap::MultiplyAlphaMask(RetainPtr mask) { dest_scan[col].alpha = mask_scan[col]; } } +#endif return true; } @@ -998,15 +1010,25 @@ bool CFX_DIBitmap::ConvertFormat(FXDIB_Format dest_format) { // SAFETY: `dest_buf` allocated with `dest_buf_size` bytes above. auto dest_span = UNSAFE_BUFFERS(pdfium::span(dest_buf.get(), dest_buf_size)); - if (dest_format == FXDIB_Format::kBgra) { - std::ranges::fill(dest_span, 0xff); - } - - RetainPtr holder(this); const uint32_t dest_pitch = pitch_size.value().pitch; - palette_ = ConvertBuffer(dest_format, dest_span, dest_pitch, GetWidth(), - GetHeight(), holder, /*src_left=*/0, - /*src_top=*/0); +#if defined(PDF_USE_LIBYUV) + if (dest_format == FXDIB_Format::kBgra && GetFormat() == FXDIB_Format::kBgr) { + libyuv::RGB24ToARGB(GetBuffer().data(), GetPitch(), dest_span.data(), + dest_pitch, GetWidth(), GetHeight()); + palette_.clear(); + } else { +#endif + if (dest_format == FXDIB_Format::kBgra) { + std::ranges::fill(dest_span, 0xff); + } + + RetainPtr holder(this); + palette_ = ConvertBuffer(dest_format, dest_span, dest_pitch, GetWidth(), + GetHeight(), holder, /*src_left=*/0, + /*src_top=*/0); +#if defined(PDF_USE_LIBYUV) + } +#endif buffer_ = std::move(dest_buf); SetFormat(dest_format); SetPitch(dest_pitch); diff --git a/core/fxge/dib/cfx_dibitmap.h b/core/fxge/dib/cfx_dibitmap.h index 0c98f1c280..5c1f7f38ad 100644 --- a/core/fxge/dib/cfx_dibitmap.h +++ b/core/fxge/dib/cfx_dibitmap.h @@ -60,13 +60,13 @@ class CFX_DIBitmap final : public CFX_DIBBase { bool Copy(RetainPtr source); // CFX_DIBBase + pdfium::span GetBuffer() const override; pdfium::span GetScanline(int line) const override; size_t GetEstimatedImageMemoryBurden() const override; -#if BUILDFLAG(IS_WIN) || defined(PDF_USE_SKIA) +#if BUILDFLAG(IS_WIN) || defined(PDF_USE_SKIA) || defined(PDF_USE_LIBYUV) RetainPtr RealizeIfNeeded() const override; #endif - pdfium::span GetBuffer() const; pdfium::span GetWritableBuffer() { pdfium::span src = GetBuffer(); // SAFETY: const_cast<>() doesn't change size. diff --git a/core/fxge/dib/cfx_dibitmap_unittest.cpp b/core/fxge/dib/cfx_dibitmap_unittest.cpp index 1ba4e5ae23..3efbb1265e 100644 --- a/core/fxge/dib/cfx_dibitmap_unittest.cpp +++ b/core/fxge/dib/cfx_dibitmap_unittest.cpp @@ -178,3 +178,53 @@ TEST(CFXDIBitmapTest, PreMultiplyFromPreMultiplied) { EXPECT_THAT(bitmap->GetBuffer(), ElementsAre(0x7f, 0x7f, 0x7f, 0x7f)); } #endif // defined(PDF_USE_SKIA) + +TEST(CFXDIBitmapTest, ConvertFormatBgrToBgra) { + auto bitmap = pdfium::MakeRetain(); + ASSERT_TRUE(bitmap->Create(2, 1, FXDIB_Format::kBgr)); + auto bgr_row = bitmap->GetWritableScanlineAs>(0); + bgr_row[0] = {11, 22, 33}; + bgr_row[1] = {44, 55, 66}; + + ASSERT_TRUE(bitmap->ConvertFormat(FXDIB_Format::kBgra)); + ASSERT_EQ(2, bitmap->GetWidth()); + ASSERT_EQ(1, bitmap->GetHeight()); + EXPECT_EQ(FXDIB_Format::kBgra, bitmap->GetFormat()); + auto bgra_row = bitmap->GetScanlineAs>(0); + EXPECT_EQ(11u, bgra_row[0].blue); + EXPECT_EQ(22u, bgra_row[0].green); + EXPECT_EQ(33u, bgra_row[0].red); + EXPECT_EQ(255u, bgra_row[0].alpha); + EXPECT_EQ(44u, bgra_row[1].blue); + EXPECT_EQ(55u, bgra_row[1].green); + EXPECT_EQ(66u, bgra_row[1].red); + EXPECT_EQ(255u, bgra_row[1].alpha); +} + +TEST(CFXDIBitmapTest, MultiplyAlphaMaskFromBgrx) { + auto bitmap = pdfium::MakeRetain(); + ASSERT_TRUE(bitmap->Create(2, 1, FXDIB_Format::kBgrx)); + auto row = bitmap->GetWritableScanlineAs>(0); + row[0] = {10, 20, 30, 0}; + row[1] = {40, 50, 60, 0}; + + auto mask = pdfium::MakeRetain(); + ASSERT_TRUE(mask->Create(2, 1, FXDIB_Format::k8bppMask)); + auto mask_row = mask->GetWritableScanline(0); + mask_row[0] = 0x12; + mask_row[1] = 0x34; + + ASSERT_TRUE(bitmap->MultiplyAlphaMask(mask)); + ASSERT_EQ(2, bitmap->GetWidth()); + ASSERT_EQ(1, bitmap->GetHeight()); + EXPECT_EQ(FXDIB_Format::kBgra, bitmap->GetFormat()); + auto out_row = bitmap->GetScanlineAs>(0); + EXPECT_EQ(10u, out_row[0].blue); + EXPECT_EQ(20u, out_row[0].green); + EXPECT_EQ(30u, out_row[0].red); + EXPECT_EQ(0x12u, out_row[0].alpha); + EXPECT_EQ(40u, out_row[1].blue); + EXPECT_EQ(50u, out_row[1].green); + EXPECT_EQ(60u, out_row[1].red); + EXPECT_EQ(0x34u, out_row[1].alpha); +} diff --git a/core/fxge/skia/cfx_dibbase_skia.cpp b/core/fxge/skia/cfx_dibbase_skia.cpp index d1d3861f97..ab8a4cf514 100644 --- a/core/fxge/skia/cfx_dibbase_skia.cpp +++ b/core/fxge/skia/cfx_dibbase_skia.cpp @@ -18,6 +18,7 @@ #include "core/fxcrt/fx_memory_wrappers.h" #include "core/fxcrt/fx_safe_types.h" #include "core/fxcrt/notreached.h" +#include "core/fxcrt/numerics/safe_conversions.h" #include "core/fxcrt/retain_ptr.h" #include "core/fxcrt/span.h" #include "core/fxge/calculate_pitch.h" @@ -31,6 +32,10 @@ #include "third_party/skia/include/core/SkPixmap.h" #include "third_party/skia/include/core/SkRefCnt.h" +#if defined(PDF_USE_LIBYUV) +#include "third_party/libyuv/include/libyuv/convert_argb.h" +#endif + namespace { // Releases `CFX_DIBitmap` "leaked" by `CreateSkiaImageFromDib()`. @@ -99,6 +104,7 @@ class PixelTransformTraits<8, PixelTransform> { } }; +#if !defined(PDF_USE_LIBYUV) template class PixelTransformTraits<24, PixelTransform> { public: @@ -113,6 +119,7 @@ class PixelTransformTraits<24, PixelTransform> { scanline[offset]); } }; +#endif template class PixelTransformTraits<32, PixelTransform> { @@ -134,6 +141,48 @@ void ValidateScanlineSize(pdfium::span scanline, DCHECK_GE(scanline.size(), min_row_bytes); } +#if defined(PDF_USE_LIBYUV) +sk_sp CreateSkiaImageFrom24BppDib(const CFX_DIBBase& source) { + const int width = source.GetWidth(); + const int height = source.GetHeight(); + SkImageInfo info = SkImageInfo::Make(width, height, kBGRA_8888_SkColorType, + kOpaque_SkAlphaType); + const size_t dst_row_bytes = info.minRowBytes(); + size_t output_size = Fx2DSizeOrDie(dst_row_bytes, height); + std::unique_ptr output( + FX_TryAlloc(uint8_t, output_size)); + if (!output) { + return nullptr; + } + + const size_t min_row_bytes = + fxge::CalculatePitch8OrDie(source.GetBPP(), /*components=*/1, width); + DCHECK_LE(min_row_bytes, source.GetPitch()); + + if (!source.GetBuffer().empty()) { + libyuv::RGB24ToARGB(source.GetBuffer().data(), source.GetPitch(), + output.get(), pdfium::checked_cast(dst_row_bytes), + width, height); + } else { + // SAFETY: `output` allocated with `output_size` bytes above. + auto output_span = UNSAFE_BUFFERS(pdfium::span(output.get(), output_size)); + for (int row = 0; row < height; ++row) { + pdfium::span scanline = source.GetScanline(row); + ValidateScanlineSize(scanline, min_row_bytes); + libyuv::RGB24ToARGB( + scanline.data(), 0, + output_span.subspan(Fx2DSizeOrDie(row, dst_row_bytes)).data(), 0, + width, 1); + } + } + + return SkImages::RasterFromPixmap( + SkPixmap(info, output.release(), dst_row_bytes), + /*rasterReleaseProc=*/ReleaseAllocatedHeldBySkImage, + /*releaseContext=*/nullptr); +} +#endif + // Creates an `SkImage` from a `CFX_DIBBase`, transforming the source pixels // using `pixel_transform`. // @@ -240,11 +289,15 @@ sk_sp CFX_DIBBase::RealizeSkImage() const { kPremul_SkAlphaType); case 24: +#if defined(PDF_USE_LIBYUV) + return CreateSkiaImageFrom24BppDib(*this); +#else return CreateSkiaImageFromTransformedDib( *this, kBGRA_8888_SkColorType, kOpaque_SkAlphaType, [](uint8_t red, uint8_t green, uint8_t blue) -> SkColor { return SkColorSetRGB(red, green, blue); }); +#endif case 32: switch (GetFormat()) { From bf4dc62c83fd8145ec3e879c08b1660eb24bd19a Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Mon, 12 Oct 2026 16:46:41 -0700 Subject: [PATCH 06/37] Add display list file comparison helpers to EmbedderTest Introduce EmbedderTest::CompareDisplayList() and helper functions to compare rendered display lists against expectation files. Add VerifySavedRenderingWithDisplayList() and VerifySavedDocumentWithDisplayList() to support testing saved document rendering with display lists. Migrate FPDFViewEmbedderTest.RenderPageToDisplayList to use CompareDisplayList() with rectangles_expected.dump.txt instead of an inline string literal. Change-Id: Ie055ae896d535ff87d1894ddc871b3b81eba87b2 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160550 Commit-Queue: Tom Sepez Reviewed-by: Lei Zhang --- fpdfsdk/fpdf_view_embeddertest.cpp | 59 +--------------- testing/embedder_test.cpp | 69 +++++++++++++++++-- testing/embedder_test.h | 10 +++ .../embedder_tests/rectangles.dump.txt | 14 ++++ 4 files changed, 88 insertions(+), 64 deletions(-) create mode 100644 testing/resources/embedder_tests/rectangles.dump.txt diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 42bbd3394f..18443141bc 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -2233,69 +2233,12 @@ TEST_F(FPDFViewEmbedderTest, DocumentVersionInCatalog) { } TEST_F(FPDFViewEmbedderTest, RenderPageToDisplayList) { - static const char kExpectedDisplayList[] = - "SaveState\n" - "SetBaseClip [0,0,200,300]\n" - "SetClip_PathFill rule=winding matrix=none " - "points=[move(0.0000,300.0000) line(0.0000,0.0000) line(200.0000,0.0000) " - "line(200.0000,300.0000) line(0.0000,300.0000,close)]\n" - "SaveState\n" - "DrawPath fill=0xff000000 stroke=0xff000000 rule=even-odd " - "stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] " - "matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] " - "points=[move(0.0000,290.0000) line(10.0000,290.0000) " - "line(10.0000,300.0000) " - "line(0.0000,300.0000) line(0.0000,290.0000,close)]\n" - "DrawPath fill=0xff000000 stroke=0xff000000 rule=even-odd " - "stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] " - "matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] " - "points=[move(10.0000,150.0000) line(60.0000,150.0000) " - "line(60.0000,180.0000) " - "line(10.0000,180.0000) line(10.0000,150.0000,close)]\n" - "DrawPath fill=0xff0000ff stroke=0xff000000 rule=even-odd " - "stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] " - "matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] " - "points=[move(190.0000,290.0000) line(200.0000,290.0000) " - "line(200.0000,300.0000) " - "line(190.0000,300.0000) line(190.0000,290.0000,close)]\n" - "DrawPath fill=0xff0000ff stroke=0xff000000 rule=even-odd " - "stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] " - "matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] " - "points=[move(70.0000,232.0000) line(120.0000,232.0000) " - "line(120.0000,262.0000) " - "line(70.0000,262.0000) line(70.0000,232.0000,close)]\n" - "DrawPath fill=0xff00ff00 stroke=0xff000000 rule=even-odd " - "stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] " - "matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] " - "points=[move(190.0000,0.0000) line(200.0000,0.0000) " - "line(200.0000,10.0000) " - "line(190.0000,10.0000) line(190.0000,0.0000,close)]\n" - "DrawPath fill=0xff00ff00 stroke=0xff000000 rule=even-odd " - "stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] " - "matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] " - "points=[move(130.0000,150.0000) line(180.0000,150.0000) " - "line(180.0000,180.0000) " - "line(130.0000,180.0000) line(130.0000,150.0000,close)]\n" - "DrawPath fill=0xffff0000 stroke=0xff000000 rule=even-odd " - "stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] " - "matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] " - "points=[move(0.0000,0.0000) line(10.0000,0.0000) line(10.0000,10.0000) " - "line(0.0000,10.0000) line(0.0000,0.0000,close)]\n" - "DrawPath fill=0xffff0000 stroke=0xff000000 rule=even-odd " - "stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] " - "matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] " - "points=[move(70.0000,67.0000) line(120.0000,67.0000) " - "line(120.0000,97.0000) " - "line(70.0000,97.0000) line(70.0000,67.0000,close)]\n" - "RestoreState\n" - "RestoreState\n"; - ASSERT_TRUE(OpenDocument("rectangles.pdf")); ScopedPage page = LoadScopedPage(0); ASSERT_TRUE(page); std::string display_list = RenderPageToDisplayList(page.get()); - EXPECT_EQ(kExpectedDisplayList, display_list); + CompareDisplayList(display_list, "rectangles"); } TEST_F(FPDFViewEmbedderTest, RenderHelloWorldToDisplayList) { diff --git a/testing/embedder_test.cpp b/testing/embedder_test.cpp index a3a37a6bbc..bed85d74aa 100644 --- a/testing/embedder_test.cpp +++ b/testing/embedder_test.cpp @@ -296,19 +296,30 @@ std::string_view GetCpuArchSuffix() { #endif // BUILDFLAG(IS_APPLE) && !defined(ARCH_CPU_ARM64) } -std::string GetEmbedderTestExpectationPath( - std::string_view expectation_png_name) { +std::string GetEmbedderTestExpectationPath(std::string_view expectation_name, + std::string_view expectation_ext) { std::string path = PathService::GetTestFilePath("embedder_tests"); if (path.empty()) { return std::string(); } path.push_back(PATH_SEPARATOR); - path.append(expectation_png_name); - path.append(".png"); + path.append(expectation_name); + path.push_back('.'); + path.append(expectation_ext); return path; } +std::string GetEmbedderTestPngExpectationPath( + std::string_view expectation_name) { + return GetEmbedderTestExpectationPath(expectation_name, "png"); +} + +std::string GetEmbedderTestDisplayListExpectationPath( + std::string_view expectation_name) { + return GetEmbedderTestExpectationPath(expectation_name, "dump.txt"); +} + std::vector GetEmbedderTestExpectationsWithSuffixPath( std::string_view expectation_png_name) { const std::string basename(expectation_png_name); @@ -341,7 +352,7 @@ std::vector GetEmbedderTestExpectationsWithSuffixPath( std::vector results; for (const auto& name : expectation_names) { - results.push_back(GetEmbedderTestExpectationPath(name)); + results.push_back(GetEmbedderTestPngExpectationPath(name)); if (results.back().empty()) { return {}; } @@ -1151,6 +1162,34 @@ void EmbedderTest::VerifySavedDocumentWithExpectationSuffix( options); } +void EmbedderTest::VerifySavedRenderingWithDisplayList( + FPDF_PAGE page, + std::string_view expectation_name, + int flags) { + CHECK(page); + CHECK(saved_document()); + std::string display_list = RenderSavedPageWithFlagsToDisplayList(page, flags); + CompareDisplayList(display_list, expectation_name); +} + +void EmbedderTest::VerifySavedDocumentWithDisplayList( + std::string_view expectation_name, + int flags) { + ScopedSavedDoc saved_doc = OpenScopedSavedDocument(); + if (!saved_doc) { + ADD_FAILURE() << "Failed to open saved document"; + return; + } + + ScopedSavedPage page = LoadScopedSavedPage(0); + if (!page) { + ADD_FAILURE() << "Failed to load page 0 from saved document"; + return; + } + + VerifySavedRenderingWithDisplayList(page.get(), expectation_name, flags); +} + ScopedFPDFBitmap EmbedderTest::VerifySavedDocumentCommon() { ScopedSavedDoc saved_doc = OpenScopedSavedDocument(); if (!saved_doc) { @@ -1213,7 +1252,8 @@ void EmbedderTest::WriteBitmapToPng(FPDF_BITMAP bitmap, // static void EmbedderTest::CompareBitmap(FPDF_BITMAP bitmap, std::string_view expectation_png_name) { - std::string png_path = GetEmbedderTestExpectationPath(expectation_png_name); + std::string png_path = + GetEmbedderTestPngExpectationPath(expectation_png_name); SCOPED_TRACE(testing::Message() << "CompareBitmap() with " << png_path); DiffOptions options = kExactDiffOptions; if (EmbedderTestEnvironment::GetInstance()->fontations()) { @@ -1265,6 +1305,23 @@ void EmbedderTest::CompareBitmapWithExpectationSuffix( ReportMissingExpectation(bitmap); } +// static +void EmbedderTest::CompareDisplayList(const std::string& display_list, + std::string_view expectation_name) { + std::string path = + GetEmbedderTestDisplayListExpectationPath(expectation_name); + SCOPED_TRACE(testing::Message() << "CompareDisplayList() with " << path); + std::vector expected_data = GetFileContents(path.c_str()); + if (expected_data.empty()) { + ADD_FAILURE() << "Missing or empty expectation file: " << path; + return; + } + std::string_view expected_text( + reinterpret_cast(expected_data.data()), + expected_data.size()); + EXPECT_EQ(display_list, expected_text); +} + // static int EmbedderTest::WriteBlockCallback(FPDF_FILEWRITE* pFileWrite, const void* data, diff --git a/testing/embedder_test.h b/testing/embedder_test.h index 8236ede7ad..19ebdfc03c 100644 --- a/testing/embedder_test.h +++ b/testing/embedder_test.h @@ -383,6 +383,11 @@ class EmbedderTest : public ::testing::Test, std::string_view expectation_png_name, const DiffOptions& options = kExactDiffOptions); + // Check `display_list` matches the expectation file named `expectation_name` + // under testing/resources/embedder_tests/. + static void CompareDisplayList(const std::string& display_list, + std::string_view expectation_name); + void ClearString() { data_string_.clear(); } const std::string& GetString() const { return data_string_; } @@ -409,6 +414,11 @@ class EmbedderTest : public ::testing::Test, void VerifySavedDocumentWithExpectationSuffix( std::string_view expectation_png_name, const DiffOptions& options = kExactDiffOptions); + void VerifySavedRenderingWithDisplayList(FPDF_PAGE page, + std::string_view expectation_name, + int flags = 0); + void VerifySavedDocumentWithDisplayList(std::string_view expectation_name, + int flags = 0); void SetWholeFileAvailable(); diff --git a/testing/resources/embedder_tests/rectangles.dump.txt b/testing/resources/embedder_tests/rectangles.dump.txt new file mode 100644 index 0000000000..b2d23ce470 --- /dev/null +++ b/testing/resources/embedder_tests/rectangles.dump.txt @@ -0,0 +1,14 @@ +SaveState +SetBaseClip [0,0,200,300] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,300.0000) line(0.0000,0.0000) line(200.0000,0.0000) line(200.0000,300.0000) line(0.0000,300.0000,close)] +SaveState +DrawPath fill=0xff000000 stroke=0xff000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] points=[move(0.0000,290.0000) line(10.0000,290.0000) line(10.0000,300.0000) line(0.0000,300.0000) line(0.0000,290.0000,close)] +DrawPath fill=0xff000000 stroke=0xff000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] points=[move(10.0000,150.0000) line(60.0000,150.0000) line(60.0000,180.0000) line(10.0000,180.0000) line(10.0000,150.0000,close)] +DrawPath fill=0xff0000ff stroke=0xff000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] points=[move(190.0000,290.0000) line(200.0000,290.0000) line(200.0000,300.0000) line(190.0000,300.0000) line(190.0000,290.0000,close)] +DrawPath fill=0xff0000ff stroke=0xff000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] points=[move(70.0000,232.0000) line(120.0000,232.0000) line(120.0000,262.0000) line(70.0000,262.0000) line(70.0000,232.0000,close)] +DrawPath fill=0xff00ff00 stroke=0xff000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] points=[move(190.0000,0.0000) line(200.0000,0.0000) line(200.0000,10.0000) line(190.0000,10.0000) line(190.0000,0.0000,close)] +DrawPath fill=0xff00ff00 stroke=0xff000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] points=[move(130.0000,150.0000) line(180.0000,150.0000) line(180.0000,180.0000) line(130.0000,180.0000) line(130.0000,150.0000,close)] +DrawPath fill=0xffff0000 stroke=0xff000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] points=[move(0.0000,0.0000) line(10.0000,0.0000) line(10.0000,10.0000) line(0.0000,10.0000) line(0.0000,0.0000,close)] +DrawPath fill=0xffff0000 stroke=0xff000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,300.0000] points=[move(70.0000,67.0000) line(120.0000,67.0000) line(120.0000,97.0000) line(70.0000,97.0000) line(70.0000,67.0000,close)] +RestoreState +RestoreState From a898334f95d4a38a1648750a125e10c7137624c6 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Mon, 12 Oct 2026 17:17:24 -0700 Subject: [PATCH 07/37] Support optional SSIM threshold in fuzzy matching suppressions Add support for an optional 4th parameter to the fuzzy action in SUPPRESSIONS, allowing tests to specify an SSIM threshold in [0.0, 1.0]. Update Suppressor._ParseFuzzyAction to accept up to 4 parameters and validate that the SSIM threshold does not exceed 1.0. Update PNGDiffer._ParseTolerances to extract the SSIM threshold, defaulting to 1.0. In PNGDiffer.EvaluateMatch, accept comparisons if either the existing MSE criteria pass or the mean SSIM strictly exceeds the configured threshold. Defaulting to 1.0 preserves existing behavior since mean SSIM cannot exceed 1.0. Change-Id: Icf84478c7c825c4c49c01a3c21168f991ea8879d Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160651 Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- testing/SUPPRESSIONS | 3 ++- testing/tools/pngdiffer.py | 16 +++++++++++----- testing/tools/suppressor.py | 6 +++++- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/testing/SUPPRESSIONS b/testing/SUPPRESSIONS index b24ec4ecf8..f6a390b7cc 100644 --- a/testing/SUPPRESSIONS +++ b/testing/SUPPRESSIONS @@ -18,7 +18,8 @@ # the test still runs but never fails, however far off it lands # blank - skip the image comparison entirely # fuzzy - compare with a tolerance, either the defaults or the explicit -# fuzzy=,, (e.g. fuzzy=3,0.05,15.0) +# fuzzy=,,[,] (e.g. fuzzy=3,0.05,15.0 or +# fuzzy=10,0.1,15.0,0.98) # skip - the test is expected to crash, so do not run it at all # # Apart from "skip", every action excuses mismatching output and nothing diff --git a/testing/tools/pngdiffer.py b/testing/tools/pngdiffer.py index f31cfecd4a..56c8a5c146 100755 --- a/testing/tools/pngdiffer.py +++ b/testing/tools/pngdiffer.py @@ -119,6 +119,7 @@ def _ParseTolerances(self, algorithm, extra_flags): delta = 3 mse = 0.05 win_mse = 15.0 + ssim = 1.0 for flag in extra_flags: if flag.startswith('--fuzzy='): params = flag[len('--fuzzy='):].split(',') @@ -128,7 +129,9 @@ def _ParseTolerances(self, algorithm, extra_flags): mse = float(params[1]) if len(params) > 2 and params[2]: win_mse = float(params[2]) - return delta, mse, win_mse + if len(params) > 3 and params[3]: + ssim = float(params[3]) + return delta, mse, win_mse, ssim def EvaluateMatch(self, metrics, image_matching_algorithm): if not metrics.dims_match: @@ -149,14 +152,17 @@ def EvaluateMatch(self, metrics, image_matching_algorithm): f'mse={metrics.mse:.6f}') if algorithm == FUZZY_MATCHING: - delta, mse, win_mse = self._ParseTolerances(algorithm, extra_flags) - if (metrics.max_delta <= delta and (mse <= 0.0 or metrics.mse <= mse) and - (win_mse <= 0.0 or metrics.win_mse <= win_mse)): + delta, mse, win_mse, ssim = self._ParseTolerances(algorithm, extra_flags) + mse_passed = ( + metrics.max_delta <= delta and (mse <= 0.0 or metrics.mse <= mse) and + (win_mse <= 0.0 or metrics.win_mse <= win_mse)) + if mse_passed or metrics.mean_ssim > ssim: return True, None return False, ( f'exceeds fuzzy: max_delta={metrics.max_delta} (max {delta}), ' f'mse={metrics.mse:.6f} (max {mse}), ' - f'win_mse={metrics.win_mse:.6f} (max {win_mse})') + f'win_mse={metrics.win_mse:.6f} (max {win_mse}), ' + f'mean_ssim={metrics.mean_ssim:.6f} (min {ssim})') return False, f'Unknown algorithm {algorithm}' diff --git a/testing/tools/suppressor.py b/testing/tools/suppressor.py index d7c4c9925b..058e5f4c93 100755 --- a/testing/tools/suppressor.py +++ b/testing/tools/suppressor.py @@ -14,7 +14,7 @@ def _ParseFuzzyAction(token): if token == 'fuzzy': return '--fuzzy' params = token[len('fuzzy='):].split(',') - if not (1 <= len(params) <= 3): + if not (1 <= len(params) <= 4): raise ValueError(f'Invalid fuzzy option format: {token}') try: delta = int(params[0]) @@ -32,6 +32,10 @@ def _ParseFuzzyAction(token): if val < 0.0: raise ValueError( f'Negative value {val} not allowed in fuzzy option: {token}') + if len(params) == 4 and float(params[3]) > 1.0: + raise ValueError( + f'SSIM score {params[3]} out of range [0.0, 1.0] in fuzzy option: ' + f'{token}') return f'--{token}' From d4a751b12cd2ca8e766393d77be89457b1e833c0 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Mon, 12 Oct 2026 18:08:02 -0700 Subject: [PATCH 08/37] Add unit tests for CFX_DIBBase::TransformTo() Add unit test coverage for CFX_DIBBase::TransformTo() in cfx_dibbase_unittest.cpp, testing empty output bounds, 8-bit mask rotation/scaling, and BGRA scaling/translation. TAG=agy CONV=913b2a22-b8f8-4d2f-a2ad-8d7cc152a129 Change-Id: I51272780d37aae5361e5439cda7de2bd996e6b7f Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160611 Reviewed-by: Tom Sepez Commit-Queue: Lei Zhang --- core/fxge/dib/cfx_dibbase_unittest.cpp | 68 ++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/core/fxge/dib/cfx_dibbase_unittest.cpp b/core/fxge/dib/cfx_dibbase_unittest.cpp index 4b422f2479..fec4df0b0a 100644 --- a/core/fxge/dib/cfx_dibbase_unittest.cpp +++ b/core/fxge/dib/cfx_dibbase_unittest.cpp @@ -5,11 +5,16 @@ #include "core/fxge/dib/cfx_dibbase.h" #include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/span.h" #include "core/fxge/dib/cfx_dibitmap.h" +#include "core/fxge/dib/fx_dib.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace { +using ::testing::ElementsAre; + struct Input { CFX_Point src_top_left; CFX_Size src_size; @@ -314,3 +319,66 @@ TEST(CFXDIBBaseTest, ConvertToBgrFromBgra) { EXPECT_EQ(50u, bgr_row[1].green); EXPECT_EQ(60u, bgr_row[1].red); } + +TEST(CFXDIBBaseTest, TransformToEmpty) { + auto bitmap = pdfium::MakeRetain(); + ASSERT_TRUE(bitmap->Create(2, 3, FXDIB_Format::kBgra)); + + int left = -1; + int top = -1; + RetainPtr result = + bitmap->TransformTo(CFX_Matrix(0, 0, 0, 0, 10, 20), &left, &top); + EXPECT_FALSE(result); + EXPECT_EQ(0, left); + EXPECT_EQ(0, top); +} + +TEST(CFXDIBBaseTest, TransformToMaskRotate90) { + auto bitmap = pdfium::MakeRetain(); + ASSERT_TRUE(bitmap->Create(2, 3, FXDIB_Format::k8bppMask)); + auto src_scan0 = bitmap->GetWritableScanline(0); + src_scan0[0] = 0x10; + src_scan0[1] = 0x20; + auto src_scan1 = bitmap->GetWritableScanline(1); + src_scan1[0] = 0x30; + src_scan1[1] = 0x40; + auto src_scan2 = bitmap->GetWritableScanline(2); + src_scan2[0] = 0x50; + src_scan2[1] = 0x60; + + int left = 0; + int top = 0; + RetainPtr result = + bitmap->TransformTo(CFX_Matrix(0, 2, 3, 0, -5, 7), &left, &top); + ASSERT_TRUE(result); + EXPECT_EQ(-5, left); + EXPECT_EQ(7, top); + ASSERT_EQ(3, result->GetWidth()); + ASSERT_EQ(2, result->GetHeight()); + EXPECT_EQ(FXDIB_Format::k8bppMask, result->GetFormat()); + EXPECT_THAT(result->GetScanline(0).first(3u), ElementsAre(0x50, 0x30, 0x10)); + EXPECT_THAT(result->GetScanline(1).first(3u), ElementsAre(0x60, 0x40, 0x20)); +} + +TEST(CFXDIBBaseTest, TransformToBgraScaleAndTranslate) { + auto bitmap = pdfium::MakeRetain(); + ASSERT_TRUE(bitmap->Create(2, 1, FXDIB_Format::kBgra)); + auto src_scan = bitmap->GetWritableScanlineAs(0); + src_scan[0] = 0xff112233; + src_scan[1] = 0xff445566; + + int left = 0; + int top = 0; + RetainPtr result = + bitmap->TransformTo(CFX_Matrix(4, 0, 0, -2, 10, 22), &left, &top); + ASSERT_TRUE(result); + EXPECT_EQ(10, left); + EXPECT_EQ(20, top); + ASSERT_EQ(4, result->GetWidth()); + ASSERT_EQ(2, result->GetHeight()); + EXPECT_EQ(FXDIB_Format::kBgra, result->GetFormat()); + EXPECT_THAT(result->GetScanlineAs(0), + ElementsAre(0xff112233, 0xff112233, 0xff445566, 0xff445566)); + EXPECT_THAT(result->GetScanlineAs(1), + ElementsAre(0xff112233, 0xff112233, 0xff445566, 0xff445566)); +} From abdb4771d9c6bcdbb6d81c4b647d462e6c63d6a0 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Mon, 12 Oct 2026 18:31:42 -0700 Subject: [PATCH 09/37] Add unit tests for CFX_DIBBase::StretchTo() Add unit test coverage for CFX_DIBBase::StretchTo() in cfx_dibbase_unittest.cpp, testing empty output bounds, 8-bit mask stretching with horizontal flipping and clipping, 8-bit grayscale stretching with vertical flipping, and BGRA stretching. TAG=agy CONV=913b2a22-b8f8-4d2f-a2ad-8d7cc152a129 Change-Id: Ie252bbe08915d93d136dd154b6560893287b2557 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160630 Reviewed-by: Tom Sepez Commit-Queue: Lei Zhang --- core/fxge/dib/cfx_dibbase_unittest.cpp | 75 ++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/core/fxge/dib/cfx_dibbase_unittest.cpp b/core/fxge/dib/cfx_dibbase_unittest.cpp index fec4df0b0a..ab24270a7a 100644 --- a/core/fxge/dib/cfx_dibbase_unittest.cpp +++ b/core/fxge/dib/cfx_dibbase_unittest.cpp @@ -320,6 +320,81 @@ TEST(CFXDIBBaseTest, ConvertToBgrFromBgra) { EXPECT_EQ(60u, bgr_row[1].red); } +TEST(CFXDIBBaseTest, StretchToEmpty) { + auto bitmap = pdfium::MakeRetain(); + ASSERT_TRUE(bitmap->Create(2, 3, FXDIB_Format::kBgra)); + + EXPECT_FALSE(bitmap->StretchTo(0, 3, FXDIB_ResampleOptions(), nullptr)); + EXPECT_FALSE(bitmap->StretchTo(2, 0, FXDIB_ResampleOptions(), nullptr)); + + constexpr FX_RECT kOutOfBoundsClip(10, 10, 20, 20); + EXPECT_FALSE( + bitmap->StretchTo(4, 6, FXDIB_ResampleOptions(), &kOutOfBoundsClip)); +} + +TEST(CFXDIBBaseTest, StretchToMaskFlipAndClip) { + auto bitmap = pdfium::MakeRetain(); + ASSERT_TRUE(bitmap->Create(2, 2, FXDIB_Format::k8bppMask)); + auto src_scan0 = bitmap->GetWritableScanline(0); + src_scan0[0] = 0x10; + src_scan0[1] = 0x20; + auto src_scan1 = bitmap->GetWritableScanline(1); + src_scan1[0] = 0x30; + src_scan1[1] = 0x40; + + constexpr FX_RECT kClip(1, 0, 3, 2); + RetainPtr result = + bitmap->StretchTo(-4, 2, FXDIB_ResampleOptions(), &kClip); + ASSERT_TRUE(result); + ASSERT_EQ(2, result->GetWidth()); + ASSERT_EQ(2, result->GetHeight()); + EXPECT_EQ(FXDIB_Format::k8bppMask, result->GetFormat()); + EXPECT_THAT(result->GetScanline(0).first(2u), ElementsAre(0x1c, 0x14)); + EXPECT_THAT(result->GetScanline(1).first(2u), ElementsAre(0x3c, 0x34)); +} + +TEST(CFXDIBBaseTest, StretchToGrayscale) { + auto bitmap = pdfium::MakeRetain(); + ASSERT_TRUE(bitmap->Create(2, 2, FXDIB_Format::k8bppRgb)); + auto src_scan0 = bitmap->GetWritableScanline(0); + src_scan0[0] = 0x10; + src_scan0[1] = 0x20; + auto src_scan1 = bitmap->GetWritableScanline(1); + src_scan1[0] = 0x30; + src_scan1[1] = 0x40; + + RetainPtr result = + bitmap->StretchTo(4, -2, FXDIB_ResampleOptions(), nullptr); + ASSERT_TRUE(result); + ASSERT_EQ(4, result->GetWidth()); + ASSERT_EQ(2, result->GetHeight()); + EXPECT_EQ(FXDIB_Format::k8bppRgb, result->GetFormat()); + EXPECT_FALSE(result->HasPalette()); + EXPECT_THAT(result->GetScanline(0).first(4u), + ElementsAre(0x30, 0x34, 0x3c, 0x40)); + EXPECT_THAT(result->GetScanline(1).first(4u), + ElementsAre(0x10, 0x14, 0x1c, 0x20)); +} + +TEST(CFXDIBBaseTest, StretchToBgra) { + auto bitmap = pdfium::MakeRetain(); + ASSERT_TRUE(bitmap->Create(2, 1, FXDIB_Format::kBgra)); + auto src_scan = bitmap->GetWritableScanlineAs(0); + src_scan[0] = 0xff112233; + src_scan[1] = 0xff445566; + + RetainPtr result = + bitmap->StretchTo(4, 2, FXDIB_ResampleOptions(), nullptr); + ASSERT_TRUE(result); + ASSERT_EQ(4, result->GetWidth()); + ASSERT_EQ(2, result->GetHeight()); + EXPECT_EQ(FXDIB_Format::kBgra, result->GetFormat()); + EXPECT_THAT(result->GetScanlineAs(0), + ElementsAre(0xff112233, 0xff112233, 0xff445566, 0xff445566)); + EXPECT_THAT(result->GetScanlineAs(1), + ElementsAre(0xff112233, 0xff112233, 0xff445566, 0xff445566)); +} + TEST(CFXDIBBaseTest, TransformToEmpty) { auto bitmap = pdfium::MakeRetain(); ASSERT_TRUE(bitmap->Create(2, 3, FXDIB_Format::kBgra)); From 0ee27549108c31e33de6b82e75a81cbb88431cfd Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Mon, 12 Oct 2026 18:41:41 -0700 Subject: [PATCH 10/37] Sort conditionals in core/fxge/BUILD.gn For instance, pdf_enable_fontations and pdf_enable_freetype blocks now live closer to each other. Change-Id: Id85bfeeed07033916ee5de8c7eabd3733bb1bc8d Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160650 Commit-Queue: Lei Zhang Reviewed-by: Tom Sepez --- core/fxge/BUILD.gn | 116 ++++++++++++++++++++++----------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/core/fxge/BUILD.gn b/core/fxge/BUILD.gn index e0b518f82b..14dfe06ed5 100644 --- a/core/fxge/BUILD.gn +++ b/core/fxge/BUILD.gn @@ -119,60 +119,6 @@ source_set("fxge") { deps = [ "//third_party/abseil-cpp:absl" ] defines = [] - if (pdf_enable_freetype) { - sources += [ - "freetype/fx_freetype.cpp", - "freetype/fx_freetype.h", - ] - public_deps += [ "../../:freetype_common" ] - } - - if (pdf_enable_freetype && (is_component_build || use_system_freetype)) { - # ft_adobe_glyph_list is not exported from the Freetype shared library so we - # need it defined in component builds and builds using system freetype. - defines += [ "DEFINE_PS_TABLES_DATA" ] - } - - if (pdf_use_agg) { - sources += [ - "agg/cfx_agg_bitmapcomposer.cpp", - "agg/cfx_agg_bitmapcomposer.h", - "agg/cfx_agg_cliprgn.cpp", - "agg/cfx_agg_cliprgn.h", - "agg/cfx_agg_devicedriver.cpp", - "agg/cfx_agg_devicedriver.h", - "agg/cfx_agg_imagerenderer.cpp", - "agg/cfx_agg_imagerenderer.h", - ] - deps += [ "../../third_party:fx_agg" ] - } - - if (pdf_use_libyuv) { - deps += [ "//third_party/libyuv" ] - } - - if (pdf_use_skia) { - sources += [ - "skia/cfx_dibbase_skia.cpp", - "skia/fx_skia_device.cpp", - ] - public_deps += [ "//skia" ] - - if (pdf_skia_font_manager_target != "") { - defines += [ "PDF_USE_SKIA_CUSTOM_FONT_MANAGER" ] - deps += [ pdf_skia_font_manager_target ] - } - } - - if (pdf_enable_fontations) { - configs += [ ":skrifa_cxx_config" ] - deps += [ - ":skrifa_cxx", - ":skrifa_cxx_cpp", - "//build/rust:cxx_cppdeps", - ] - } - if (is_android) { sources += [ "android/cfx_androidfontinfo.cpp", @@ -222,6 +168,29 @@ source_set("fxge") { configs -= [ "//build/config/win:lean_and_mean" ] } + if (pdf_enable_fontations) { + configs += [ ":skrifa_cxx_config" ] + deps += [ + ":skrifa_cxx", + ":skrifa_cxx_cpp", + "//build/rust:cxx_cppdeps", + ] + } + + if (pdf_enable_freetype) { + sources += [ + "freetype/fx_freetype.cpp", + "freetype/fx_freetype.h", + ] + public_deps += [ "../../:freetype_common" ] + } + + if (pdf_enable_freetype && (is_component_build || use_system_freetype)) { + # ft_adobe_glyph_list is not exported from the Freetype shared library so we + # need it defined in component builds and builds using system freetype. + defines += [ "DEFINE_PS_TABLES_DATA" ] + } + if (pdf_enable_xfa) { sources += [ "cfx_cttnametable.cpp", @@ -229,6 +198,37 @@ source_set("fxge") { ] } + if (pdf_use_agg) { + sources += [ + "agg/cfx_agg_bitmapcomposer.cpp", + "agg/cfx_agg_bitmapcomposer.h", + "agg/cfx_agg_cliprgn.cpp", + "agg/cfx_agg_cliprgn.h", + "agg/cfx_agg_devicedriver.cpp", + "agg/cfx_agg_devicedriver.h", + "agg/cfx_agg_imagerenderer.cpp", + "agg/cfx_agg_imagerenderer.h", + ] + deps += [ "../../third_party:fx_agg" ] + } + + if (pdf_use_libyuv) { + deps += [ "//third_party/libyuv" ] + } + + if (pdf_use_skia) { + sources += [ + "skia/cfx_dibbase_skia.cpp", + "skia/fx_skia_device.cpp", + ] + public_deps += [ "//skia" ] + + if (pdf_skia_font_manager_target != "") { + defines += [ "PDF_USE_SKIA_CUSTOM_FONT_MANAGER" ] + deps += [ pdf_skia_font_manager_target ] + } + } + visibility = [ "../../*" ] } @@ -311,10 +311,6 @@ pdfium_unittest_source_set("unittests") { configs = [] pdfium_root_dir = "../../" - if (is_win) { - sources += [ "win32/cfx_psrenderer_unittest.cpp" ] - } - # CFX_AndroidFontInfo contains cross-platform logic that can be tested on # Linux without Android-specific APIs. if (is_linux) { @@ -325,6 +321,10 @@ pdfium_unittest_source_set("unittests") { ] } + if (is_win) { + sources += [ "win32/cfx_psrenderer_unittest.cpp" ] + } + if (pdf_enable_fontations) { sources += [ "skrifa/fx_skrifa_unittest.cpp" ] deps += [ From 6153dfada3bb0c09f165638786c22f7d83ddd62f Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Tue, 13 Oct 2026 10:52:02 -0700 Subject: [PATCH 11/37] Combine V8 and XFA columns in SUPPRESSIONS Combine columns 2 (V8 support) and 3 (XFA support) into a single engine column (column 2) accepting nov8, v8, and xfa. Because XFA requires V8, the combination nov8 with XFA is impossible, and nov8 without XFA is redundant with nov8. Combining these into a single 3-state engine column simplifies the suppression table from 7 columns to 6 columns. Add convert_suppressions.py to perform the transformation on SUPPRESSIONS. Update Suppressor._VALID_COLUMN_VALUES, _SuppressionSpecificity, and _MatchSuppression to match against the unified engine column. Change-Id: Ib4a892f2a56a9dc26e5a860bb67410a0051a093b Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160670 Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- testing/SUPPRESSIONS | 2983 +++++++++++++++++------------------ testing/tools/suppressor.py | 41 +- 2 files changed, 1512 insertions(+), 1512 deletions(-) diff --git a/testing/SUPPRESSIONS b/testing/SUPPRESSIONS index f6a390b7cc..ebd08760d4 100644 --- a/testing/SUPPRESSIONS +++ b/testing/SUPPRESSIONS @@ -4,16 +4,15 @@ # # List of expectations for tests that do not match their expected images, # one per line. -# There are seven space-separated columns per line +# There are six space-separated columns per line # Each column (except column 0) can contain a comma-separated list of values. # # Column 0: test file name # Column 1: platform: *, win, mac, mac_arm, mac_x86, linux -# Column 2: v8 support: *, nov8, v8 -# Column 3: xfa support: *, noxfa, xfa -# Column 4: rendering support: *, agg, gdi, gdi_agg, gdi_skia, skia -# Column 5: font engine: *, freetype, fontations -# Column 6: action, one of: +# Column 2: engine: *, nov8, v8, xfa +# Column 3: rendering support: *, agg, gdi, gdi_agg, gdi_skia, skia +# Column 4: font engine: *, freetype, fontations +# Column 5: action, one of: # diff - the output differs in a way that no tolerance can bridge, so # the test still runs but never fails, however far off it lands # blank - skip the image comparison entirely @@ -32,7 +31,7 @@ # comma-separated values must match in order for the column to "match". # The filenames and keywords are case-sensitive. # One exception is column 1, where "mac" is a shorthand that matches either -# "mac_arm" or "mac_x86". Similarly, "gdi" in column 4 is a shorthand that +# "mac_arm" or "mac_x86". Similarly, "gdi" in column 3 is a shorthand that # matches either "gdi_agg" or "gdi_skia". # # Try to keep the file alphabetized within each category of test. @@ -40,1615 +39,1615 @@ # # Corpus tests # -12.pdf mac * * agg * diff -12.pdf * * * * fontations fuzzy=10,0.1,15 -1_1_textbox.pdf * * * * * diff -1_2_typewriter.pdf * * * * * diff -1_3_callout.pdf * * * * * diff -1_matrix.pdf mac * * agg * diff -1_matrix.pdf * * * * fontations fuzzy=10,0.1,15 -1m_diff_lsjdf.pdf mac * * agg * diff -1m_diff_lsjdf.pdf * * * * fontations fuzzy=10,0.1,15 -1m_same_xxxx.pdf mac * * agg * diff -2_11_stamp3.pdf mac * * agg * diff -2_11_stamp3.pdf * * * * fontations fuzzy=10,0.1,15 -2_11_stamp3.pdf mac * * skia * fuzzy -2_6_textbox.pdf * * * * * diff -2_color_calrgb.pdf mac * * agg * diff -2_color_calrgb.pdf * * * * fontations fuzzy=10,0.1,15 -2_color_indexed.pdf mac * * agg * diff -2_color_indexed.pdf * * * * fontations fuzzy=10,0.1,15 -3_4_textbox.pdf * * * * * diff -3_interpolate_image.pdf mac * * agg * diff -3_interpolate_image.pdf * * * * fontations fuzzy=10,0.1,15 -3_interpolate_image.pdf mac * * skia * fuzzy -3bigpreview.pdf mac * * agg * diff -3bigpreview.pdf * * * * * fuzzy=21,0.15,10.0 -3bigpreview.pdf * * * * fontations fuzzy=25,0.25,15 -4_35.pdf mac * * agg * diff -4_35.pdf * * * * fontations fuzzy=10,0.1,15 -4_39.pdf mac * * agg * diff -4_39.pdf * * * * fontations fuzzy=10,0.1,15 -5.1.pdf mac * * agg * diff -5.1.pdf * * * * fontations fuzzy=10,0.1,15 -5.2.pdf * * * * * diff -5.5_simple_font.pdf mac * * agg * diff -5.5_simple_font.pdf * * * * fontations diff -8.2_name_dest_f_dest.pdf mac * * agg * diff -8.2_name_dest_f_dest.pdf * * * * fontations fuzzy=10,0.1,15 -8.2_outline.pdf mac * * agg * diff -8.2_outline.pdf * * * * fontations fuzzy=10,0.1,15 -8.3_presentation.pdf mac * * agg * diff -8.3_presentation.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_10_8.2.2__T8.3_original_file.pdf * * * * * diff -FRC_11_8.2.2__T8.3_first_last_exchange.pdf * * * * * diff -FRC_12_8.2.2__T8.3_first_outline_obj_ID.pdf * * * * * diff -FRC_13_8.2.2__T8.3_Count_edit300.pdf * * * * * diff -FRC_14_8.2.2__T8.3_Count_edit0.pdf * * * * * diff -FRC_15_8.2.2__T8.3_Count_edit1.pdf * * * * * diff -FRC_16_8.2.2__T8.3_Count_edit_1.pdf * * * * * diff -FRC_1_8.2.2__T8.3_First_empty.pdf * * * * * diff -FRC_2_8.2.2__T8.3_Last_empty.pdf * * * * * diff -FRC_3.5_P__3616_Password_1.pdf * * * * * diff -FRC_3_8.2.2_Type_empty.pdf * * * * * diff -FRC_4_8.2.2__T8.3_Count_empty.pdf * * * * * diff -FRC_5_8.2.2__T8.3_First_remove.pdf * * * * * diff -FRC_6_8.2.2__T8.3_Last_remove.pdf * * * * * diff -FRC_7_8.2.2_Type_remove.pdf * * * * * diff -FRC_8.4.1_Annotations_M.pdf * * * * * diff -FRC_8.4.1_Annotations_NM.pdf * * * * * diff -FRC_8.5_Page_C_SubmitForm.pdf * * * * * diff -FRC_8.5_Page_PI_ResetForm_Phantom.pdf * * * * * diff -FRC_8.5_Widget_F.pdf * nov8 * * * diff -FRC_8.5_Widget_F.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8_8.2.2__T8.3_Count_remove.pdf * * * * * diff -FRC_9_8.2.2__T8.3_remove_first_item.pdf * * * * * diff -action.pdf * * * * * diff -action_execute_a_menu_item.pdf mac * * agg * diff -action_execute_a_menu_item.pdf * * * * fontations fuzzy=10,0.1,15 -action_execute_a_menu_item.pdf mac * * skia * fuzzy -action_hide_show_form.pdf mac * * agg * diff -action_hide_show_form.pdf * * * * fontations fuzzy=10,0.1,15 -action_hide_show_form.pdf mac * * skia * fuzzy -action_on_focus.pdf mac * * agg * diff -action_on_focus.pdf * * * * fontations fuzzy=10,0.1,15 -action_open_a_file.pdf mac * * agg * diff -action_open_a_file.pdf * * * * fontations fuzzy=10,0.1,15 -action_pdf_save_close.pdf mac * * agg * diff -action_pdf_save_close.pdf * * * * fontations fuzzy=10,0.1,15 -action_reset.pdf mac * * agg * diff -action_reset.pdf * * * * fontations fuzzy=10,0.1,15 -action_reset.pdf mac * * skia * fuzzy -action_run_javascript.pdf mac * * agg * diff -action_run_javascript.pdf * * * * fontations fuzzy=10,0.1,15 -action_submit_a_form.pdf mac * * agg * diff -action_submit_a_form.pdf * * * * fontations fuzzy=10,0.1,15 -all_trigger_alert.pdf * * * * * diff -all_trigger_mailmsg.pdf * * * * * diff -all_trigger_print.pdf * * * * * diff -all_trigger_run_js_lunchurl.pdf mac * * agg * diff -all_trigger_run_js_lunchurl.pdf * * * * fontations fuzzy=10,0.1,15 -all_trigger_run_js_lunchurl.pdf mac * * skia * fuzzy -all_trigger_run_js_maildoc.pdf mac * * agg * diff -all_trigger_run_js_maildoc.pdf * * * * fontations fuzzy=10,0.1,15 -all_trigger_run_js_maildoc.pdf mac * * skia * fuzzy -annotation_highlight_author_content.pdf mac * * agg * diff -annotation_highlight_author_content.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_highlight_author_content.pdf mac * * skia * fuzzy -annotation_highlight_long_content.pdf mac * * agg * diff -annotation_highlight_long_content.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_highlight_long_content.pdf mac * * skia * fuzzy -annotation_highlight_no_author.pdf mac * * agg * diff -annotation_highlight_no_author.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_highlight_no_author.pdf mac * * skia * fuzzy -app_launchurl.pdf mac * * agg * diff -app_launchurl.pdf * * * * fontations fuzzy=10,0.1,15 -appstoredescription3.1_en_updated.pdf mac * * agg * diff -appstoredescription3.1_en_updated.pdf * * * * fontations fuzzy=10,0.1,15 -bookmark.pdf * * * * * diff -bookmarkgetcolor.pdf mac * * agg * diff -bookmarkgetcolor.pdf * * * * fontations diff -bug_0_length_line.pdf mac * * agg * diff -bug_0_length_line.pdf * * * * fontations fuzzy=10,0.1,15 +12.pdf mac * agg * diff +12.pdf * * * fontations fuzzy=10,0.1,15 +1_1_textbox.pdf * * * * diff +1_2_typewriter.pdf * * * * diff +1_3_callout.pdf * * * * diff +1_matrix.pdf mac * agg * diff +1_matrix.pdf * * * fontations fuzzy=10,0.1,15 +1m_diff_lsjdf.pdf mac * agg * diff +1m_diff_lsjdf.pdf * * * fontations fuzzy=10,0.1,15 +1m_same_xxxx.pdf mac * agg * diff +2_11_stamp3.pdf mac * agg * diff +2_11_stamp3.pdf * * * fontations fuzzy=10,0.1,15 +2_11_stamp3.pdf mac * skia * fuzzy +2_6_textbox.pdf * * * * diff +2_color_calrgb.pdf mac * agg * diff +2_color_calrgb.pdf * * * fontations fuzzy=10,0.1,15 +2_color_indexed.pdf mac * agg * diff +2_color_indexed.pdf * * * fontations fuzzy=10,0.1,15 +3_4_textbox.pdf * * * * diff +3_interpolate_image.pdf mac * agg * diff +3_interpolate_image.pdf * * * fontations fuzzy=10,0.1,15 +3_interpolate_image.pdf mac * skia * fuzzy +3bigpreview.pdf mac * agg * diff +3bigpreview.pdf * * * * fuzzy=21,0.15,10.0 +3bigpreview.pdf * * * fontations fuzzy=25,0.25,15 +4_35.pdf mac * agg * diff +4_35.pdf * * * fontations fuzzy=10,0.1,15 +4_39.pdf mac * agg * diff +4_39.pdf * * * fontations fuzzy=10,0.1,15 +5.1.pdf mac * agg * diff +5.1.pdf * * * fontations fuzzy=10,0.1,15 +5.2.pdf * * * * diff +5.5_simple_font.pdf mac * agg * diff +5.5_simple_font.pdf * * * fontations diff +8.2_name_dest_f_dest.pdf mac * agg * diff +8.2_name_dest_f_dest.pdf * * * fontations fuzzy=10,0.1,15 +8.2_outline.pdf mac * agg * diff +8.2_outline.pdf * * * fontations fuzzy=10,0.1,15 +8.3_presentation.pdf mac * agg * diff +8.3_presentation.pdf * * * fontations fuzzy=10,0.1,15 +FRC_10_8.2.2__T8.3_original_file.pdf * * * * diff +FRC_11_8.2.2__T8.3_first_last_exchange.pdf * * * * diff +FRC_12_8.2.2__T8.3_first_outline_obj_ID.pdf * * * * diff +FRC_13_8.2.2__T8.3_Count_edit300.pdf * * * * diff +FRC_14_8.2.2__T8.3_Count_edit0.pdf * * * * diff +FRC_15_8.2.2__T8.3_Count_edit1.pdf * * * * diff +FRC_16_8.2.2__T8.3_Count_edit_1.pdf * * * * diff +FRC_1_8.2.2__T8.3_First_empty.pdf * * * * diff +FRC_2_8.2.2__T8.3_Last_empty.pdf * * * * diff +FRC_3.5_P__3616_Password_1.pdf * * * * diff +FRC_3_8.2.2_Type_empty.pdf * * * * diff +FRC_4_8.2.2__T8.3_Count_empty.pdf * * * * diff +FRC_5_8.2.2__T8.3_First_remove.pdf * * * * diff +FRC_6_8.2.2__T8.3_Last_remove.pdf * * * * diff +FRC_7_8.2.2_Type_remove.pdf * * * * diff +FRC_8.4.1_Annotations_M.pdf * * * * diff +FRC_8.4.1_Annotations_NM.pdf * * * * diff +FRC_8.5_Page_C_SubmitForm.pdf * * * * diff +FRC_8.5_Page_PI_ResetForm_Phantom.pdf * * * * diff +FRC_8.5_Widget_F.pdf * nov8 * * diff +FRC_8.5_Widget_F.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8_8.2.2__T8.3_Count_remove.pdf * * * * diff +FRC_9_8.2.2__T8.3_remove_first_item.pdf * * * * diff +action.pdf * * * * diff +action_execute_a_menu_item.pdf mac * agg * diff +action_execute_a_menu_item.pdf * * * fontations fuzzy=10,0.1,15 +action_execute_a_menu_item.pdf mac * skia * fuzzy +action_hide_show_form.pdf mac * agg * diff +action_hide_show_form.pdf * * * fontations fuzzy=10,0.1,15 +action_hide_show_form.pdf mac * skia * fuzzy +action_on_focus.pdf mac * agg * diff +action_on_focus.pdf * * * fontations fuzzy=10,0.1,15 +action_open_a_file.pdf mac * agg * diff +action_open_a_file.pdf * * * fontations fuzzy=10,0.1,15 +action_pdf_save_close.pdf mac * agg * diff +action_pdf_save_close.pdf * * * fontations fuzzy=10,0.1,15 +action_reset.pdf mac * agg * diff +action_reset.pdf * * * fontations fuzzy=10,0.1,15 +action_reset.pdf mac * skia * fuzzy +action_run_javascript.pdf mac * agg * diff +action_run_javascript.pdf * * * fontations fuzzy=10,0.1,15 +action_submit_a_form.pdf mac * agg * diff +action_submit_a_form.pdf * * * fontations fuzzy=10,0.1,15 +all_trigger_alert.pdf * * * * diff +all_trigger_mailmsg.pdf * * * * diff +all_trigger_print.pdf * * * * diff +all_trigger_run_js_lunchurl.pdf mac * agg * diff +all_trigger_run_js_lunchurl.pdf * * * fontations fuzzy=10,0.1,15 +all_trigger_run_js_lunchurl.pdf mac * skia * fuzzy +all_trigger_run_js_maildoc.pdf mac * agg * diff +all_trigger_run_js_maildoc.pdf * * * fontations fuzzy=10,0.1,15 +all_trigger_run_js_maildoc.pdf mac * skia * fuzzy +annotation_highlight_author_content.pdf mac * agg * diff +annotation_highlight_author_content.pdf * * * fontations fuzzy=10,0.1,15 +annotation_highlight_author_content.pdf mac * skia * fuzzy +annotation_highlight_long_content.pdf mac * agg * diff +annotation_highlight_long_content.pdf * * * fontations fuzzy=10,0.1,15 +annotation_highlight_long_content.pdf mac * skia * fuzzy +annotation_highlight_no_author.pdf mac * agg * diff +annotation_highlight_no_author.pdf * * * fontations fuzzy=10,0.1,15 +annotation_highlight_no_author.pdf mac * skia * fuzzy +app_launchurl.pdf mac * agg * diff +app_launchurl.pdf * * * fontations fuzzy=10,0.1,15 +appstoredescription3.1_en_updated.pdf mac * agg * diff +appstoredescription3.1_en_updated.pdf * * * fontations fuzzy=10,0.1,15 +bookmark.pdf * * * * diff +bookmarkgetcolor.pdf mac * agg * diff +bookmarkgetcolor.pdf * * * fontations diff +bug_0_length_line.pdf mac * agg * diff +bug_0_length_line.pdf * * * fontations fuzzy=10,0.1,15 # TODO(crbug.com/42270825): Remove after associated bug is fixed -bug_0_length_line.pdf * * * skia * diff +bug_0_length_line.pdf * * skia * diff -bug_0_width_line.pdf mac * * agg * diff -bug_0_width_line.pdf * * * * fontations fuzzy=10,0.1,15 -bug_440132.pdf mac * * agg * diff -bug_440132.pdf * * * * fontations fuzzy=10,0.1,15 -bug_white_space.pdf mac * * agg * diff -bug_white_space.pdf * * * * fontations fuzzy=10,0.1,15 -calcorderindex_test.pdf * * * * * diff -calculate_average.pdf mac * * agg * diff -calculate_average.pdf * * * * fontations fuzzy=10,0.1,15 -calculate_order.pdf * * * * * diff -calculate_sum_a_b_c.pdf mac * * agg * diff -calculate_sum_a_b_c.pdf * * * * fontations fuzzy=10,0.1,15 -calculate_validate.pdf mac * * agg * diff -calculate_validate.pdf * * * * fontations fuzzy=10,0.1,15 -calculate_validate.pdf * nov8 * * * diff -ch_1.pdf * * * * * diff -check_box.pdf * * * * * diff -color.pdf mac * * agg * diff -color.pdf * * * * fontations fuzzy=10,0.1,15 -colorspace.pdf mac * * agg * diff -colorspace.pdf * * * * fontations fuzzy=10,0.1,15 -colorspace.pdf mac * * skia * fuzzy -colorspace_test1.pdf mac * * agg * diff -colorspace_test1.pdf * * * * fontations fuzzy=10,0.1,15 -colorspace_test1.pdf mac * * skia * fuzzy -combo_box.pdf * * * * * diff -combo_box_format.pdf mac * * agg * diff -combo_box_format.pdf * * * * fontations fuzzy=10,0.1,15 -date.pdf mac * * agg * diff -date.pdf * * * * fontations fuzzy=10,0.1,15 -edit_transform.pdf mac * * agg * diff -edit_transform.pdf * * * * fontations fuzzy=10,0.1,15 -en_contact.pdf mac * * agg * diff -en_contact.pdf * * * * fontations fuzzy=10,0.1,15 -en_diy.pdf mac * * agg * diff -en_diy.pdf * * * * fontations diff -en_foxit.pdf mac * * agg * diff -en_foxit.pdf * * * * fontations diff -en_fqa2.pdf mac * * agg * diff -en_fqa2.pdf * * * * fontations fuzzy=10,0.1,15 -en_fqa2.pdf mac * * skia * fuzzy -en_introduce.pdf mac * * agg * diff -en_introduce.pdf * * * * fontations fuzzy=10,0.1,15 -en_tem.pdf mac * * agg * diff -en_tem.pdf * * * * fontations diff -en_tem.pdf * * * * * fuzzy -en_tem.pdf mac * * skia * fuzzy -en_uicase_.pdf mac * * agg * diff -en_uicase_.pdf * * * * fontations fuzzy=10,0.1,15 -en_uicase_.pdf mac * * skia * fuzzy -event.change.pdf mac * * agg * diff -event.change.pdf * * * * fontations fuzzy=10,0.1,15 -event.changeex.pdf mac * * agg * diff -event.changeex.pdf * * * * fontations fuzzy=10,0.1,15 -event.keydown.pdf mac * * agg * diff -event.keydown.pdf * * * * fontations fuzzy=10,0.1,15 -event.keydown_1_.pdf mac * * agg * diff -event.keydown_1_.pdf * * * * fontations fuzzy=10,0.1,15 -event.type_name.pdf mac * * agg * diff -event.type_name.pdf * * * * fontations fuzzy=10,0.1,15 -event.value.pdf mac * * agg * diff -event.value.pdf * * * * fontations fuzzy=10,0.1,15 -event_change.pdf mac * * agg * diff -event_change.pdf * * * * fontations fuzzy=10,0.1,15 -example_001.pdf mac * * agg * diff -example_001.pdf * * * * fontations diff -example_001.pdf * * * * * fuzzy -example_001.pdf mac * * skia * fuzzy -example_002.pdf mac * * agg * diff -example_002.pdf * * * * fontations fuzzy=10,0.1,15 -example_003.pdf mac * * agg * diff -example_003.pdf * * * * fontations diff -example_003.pdf * * * * * fuzzy -example_004.pdf mac * * agg * diff -example_004.pdf * * * * fontations diff -example_004.pdf * * * * * fuzzy -example_005.pdf mac * * agg * diff -example_005.pdf * * * * fontations diff -example_005.pdf * * * * * fuzzy -example_006.pdf mac * * agg * diff -example_006.pdf * * * * fontations diff -example_006.pdf * * * * * fuzzy -example_006.pdf mac * * skia * fuzzy -example_007.pdf mac * * agg * diff -example_007.pdf * * * * fontations diff -example_007.pdf * * * * * fuzzy -example_008.pdf mac * * agg * diff -example_008.pdf * * * * fontations diff -example_008.pdf * * * * * fuzzy -example_009.pdf mac * * agg * diff -example_009.pdf * * * * fontations diff -example_009.pdf * * * * * fuzzy=3,0.15,5.0 -example_010.pdf mac * * agg * diff -example_010.pdf * * * * fontations diff -example_010.pdf * * * * * fuzzy -example_010.pdf mac * * skia * fuzzy -example_011.pdf mac * * agg * diff -example_011.pdf * * * * fontations diff -example_011.pdf * * * * * fuzzy -example_012.pdf mac * * agg * diff -example_012.pdf * * * * fontations fuzzy=10,0.1,15 -example_013.pdf mac * * agg * diff -example_013.pdf * * * * fontations diff -example_013.pdf * * * * * fuzzy -example_014.pdf mac * * agg * diff -example_014.pdf * * * * fontations diff -example_014.pdf * * * * * fuzzy -example_015.pdf mac * * agg * diff -example_015.pdf * * * * fontations diff -example_015.pdf * * * * * fuzzy -example_016.pdf mac * * agg * diff -example_016.pdf * * * * fontations diff -example_016.pdf * * * * * fuzzy -example_017.pdf mac * * agg * diff -example_017.pdf * * * * fontations diff -example_017.pdf * * * * * fuzzy -example_018.pdf mac * * agg * diff -example_018.pdf * * * * fontations diff -example_018.pdf * * * * * fuzzy -example_018.pdf mac * * skia * fuzzy -example_019.pdf mac * * agg * diff -example_019.pdf * * * * fontations diff -example_019.pdf * * * * * fuzzy -example_020.pdf mac * * agg * diff -example_020.pdf * * * * fontations diff -example_020.pdf * * * * * fuzzy -example_021.pdf mac * * agg * diff -example_021.pdf * * * * fontations diff -example_021.pdf * * * * * fuzzy -example_022.pdf mac * * agg * diff -example_022.pdf * * * * fontations diff -example_022.pdf * * * * * fuzzy -example_023.pdf mac * * agg * diff -example_023.pdf * * * * fontations diff -example_023.pdf * * * * * fuzzy -example_024.pdf mac * * agg * diff -example_024.pdf * * * * fontations diff -example_024.pdf * * * * * fuzzy -example_025.pdf mac * * agg * diff -example_025.pdf * * * * fontations diff -example_025.pdf * * * * * fuzzy -example_025.pdf mac * * skia * fuzzy -example_026.pdf mac * * agg * diff -example_026.pdf * * * * * fuzzy=4,0.05,5.0 -example_027.pdf mac * * agg * diff -example_027.pdf * * * * fontations diff -example_027.pdf * * * * * fuzzy -example_028.pdf mac * * agg * diff -example_028.pdf * * * * fontations fuzzy=10,0.1,15 -example_029.pdf mac * * agg * diff -example_029.pdf * * * * fontations diff -example_029.pdf * * * * * fuzzy -example_030.pdf mac * * agg * diff -example_030.pdf * * * * fontations diff -example_030.pdf * * * * * fuzzy -example_031.pdf mac * * agg * diff -example_031.pdf * * * * fontations diff -example_031.pdf * * * * * fuzzy -example_032.pdf mac * * agg * diff -example_032.pdf * * * * fontations diff -example_032.pdf * * * * * fuzzy -example_033.pdf mac * * agg * diff -example_033.pdf * * * * fontations diff -example_033.pdf * * * * * fuzzy -example_034.pdf mac * * agg * diff -example_034.pdf * * * * * fuzzy=4,0.05,5.0 -example_034.pdf * * * * fontations fuzzy=10,0.1,15 -example_035.pdf mac * * agg * diff -example_035.pdf * * * * fontations diff -example_035.pdf * * * * * fuzzy -example_036.pdf mac * * agg * diff -example_036.pdf * * * * fontations diff -example_036.pdf * * * * * fuzzy -example_037.pdf mac * * agg * diff -example_037.pdf * * * * fontations diff -example_037.pdf * * * * * fuzzy -example_038.pdf mac * * agg * diff -example_038.pdf * * * * fontations diff -example_038.pdf * * * * * fuzzy -example_039.pdf mac * * agg * diff -example_039.pdf * * * * fontations diff -example_039.pdf * * * * * fuzzy -example_039.pdf mac * * skia * fuzzy -example_040.pdf mac * * agg * diff -example_040.pdf * * * * fontations diff -example_040.pdf * * * * * fuzzy -example_040.pdf mac * * skia * fuzzy -example_041.pdf mac * * agg * diff -example_041.pdf * * * * fontations diff -example_041.pdf * * * * * fuzzy -example_042.pdf mac * * agg * diff -example_042.pdf * * * * fontations diff -example_042.pdf * * * * * fuzzy -example_043.pdf mac * * agg * diff -example_043.pdf * * * * fontations diff -example_043.pdf * * * * * fuzzy -example_044.pdf mac * * agg * diff -example_044.pdf * * * * fontations diff -example_044.pdf * * * * * fuzzy -example_045.pdf mac * * agg * diff -example_045.pdf * * * * fontations diff -example_045.pdf * * * * * fuzzy -example_046.pdf mac * * agg * diff -example_046.pdf * * * * fontations diff -example_046.pdf * * * * * fuzzy -example_047.pdf mac * * agg * diff -example_047.pdf * * * * fontations diff -example_047.pdf * * * * * fuzzy -example_048.pdf mac * * agg * diff -example_048.pdf * * * * fontations diff -example_048.pdf * * * * * fuzzy -example_049.pdf mac * * agg * diff -example_049.pdf * * * * fontations diff -example_049.pdf * * * * * fuzzy -example_050.pdf mac * * agg * diff -example_050.pdf * * * * fontations diff -example_050.pdf * * * * * fuzzy -example_051.pdf mac * * agg * diff -example_051.pdf * * * * * fuzzy=3,0.35,5.0 -example_051.pdf * * * * fontations fuzzy=10,0.35,15 -example_052.pdf mac * * agg * diff -example_052.pdf * * * * fontations diff -example_052.pdf * * * * * fuzzy -example_053.pdf mac * * agg * diff -example_053.pdf * * * * fontations diff -example_053.pdf * * * * * fuzzy -example_054.pdf mac * * agg * diff -example_054.pdf * * * * fontations diff -example_054.pdf * * * * * fuzzy -example_055.pdf mac * * agg * diff -example_055.pdf * * * * fontations diff -example_055.pdf * * * * * fuzzy -example_056.pdf mac * * agg * diff -example_056.pdf * * * * fontations diff -example_056.pdf * * * * * fuzzy -example_057.pdf mac * * agg * diff -example_057.pdf * * * * fontations diff -example_057.pdf * * * * * fuzzy -example_057.pdf mac * * skia * fuzzy -example_058.pdf mac * * agg * diff -example_058.pdf * * * * fontations diff -example_058.pdf * * * * * fuzzy -example_058.pdf mac * * skia * fuzzy -example_059.pdf mac * * agg * diff -example_059.pdf * * * * fontations diff -example_059.pdf * * * * * fuzzy -example_060.pdf mac * * agg * diff -example_060.pdf * * * * fontations diff -example_060.pdf * * * * * fuzzy -example_060.pdf mac * * skia * fuzzy -example_061.pdf mac * * agg * diff -example_061.pdf * * * * fontations diff -example_061.pdf * * * * * fuzzy -example_062.pdf mac * * agg * diff -example_062.pdf * * * * * fuzzy=4,0.05,5.0 -example_062.pdf * * * * fontations fuzzy=10,0.1,15 -example_063.pdf mac * * agg * diff -example_063.pdf * * * * fontations diff -example_063.pdf * * * * * fuzzy -example_063.pdf mac * * skia * fuzzy -example_064.pdf mac * * agg * diff -example_064.pdf * * * * fontations diff -example_064.pdf * * * * * fuzzy -example_064.pdf mac * * skia * fuzzy -example_065.pdf mac * * agg * diff -example_065.pdf * * * * fontations fuzzy=15,0.05,15 -example_065.pdf * * * * * fuzzy -fillform.pdf * * * * * diff -form_action_trigger.pdf * * * * * diff -form_button_sign_url.pdf * * * * * diff -form_combo_sign_url.pdf * * * * * diff -form_combobox0.pdf * * * * * diff -form_combobox_actioin_goto.pdf * * * * * diff -form_combobox_date.pdf mac * * agg * diff -form_combobox_date.pdf * * * * fontations fuzzy=10,0.1,15 -form_combobox_date.pdf * nov8 * * * diff -form_combobox_date1.pdf * * * * * diff -form_combobox_date2.pdf mac * * agg * diff -form_combobox_date2.pdf * * * * fontations fuzzy=10,0.1,15 -form_combobox_date2.pdf * nov8 * * * diff -form_combobox_importform.pdf * * * * * diff -form_combobox_num.pdf mac * * agg * diff -form_combobox_num.pdf * * * * fontations fuzzy=10,0.1,15 -form_combobox_num.pdf * nov8 * * * diff -form_combobox_per.pdf mac * * agg * diff -form_combobox_per.pdf * * * * fontations fuzzy=10,0.1,15 -form_combobox_per.pdf * nov8 * * * diff -form_combobox_plus.pdf mac * * agg * diff -form_combobox_plus.pdf * * * * fontations fuzzy=10,0.1,15 -form_combobox_plus.pdf * nov8 * * * diff -form_combobox_product.pdf mac * * agg * diff -form_combobox_product.pdf * * * * fontations fuzzy=10,0.1,15 -form_combobox_product.pdf * nov8 * * * diff -form_combobox_resetform.pdf * * * * * diff -form_combobox_time.pdf mac * * agg * diff -form_combobox_time.pdf * * * * fontations fuzzy=10,0.1,15 -form_combobox_time.pdf * nov8 * * * diff -form_list.pdf * * * * * diff -form_list1.pdf * * * * * diff -form_same.pdf mac * * agg * diff -form_same.pdf * * * * fontations diff -form_text_sign_url.pdf * * * * * diff -format_combo_box.pdf mac * * agg * diff -format_combo_box.pdf * * * * fontations fuzzy=10,0.1,15 -format_combo_box.pdf * nov8 * * * diff -format_custom_format.pdf * nov8 * agg * diff -format_custom_format.pdf * * * * fontations fuzzy=10,0.1,15 -format_custom_keystroke.pdf * * * * * diff -format_date.pdf * nov8 * * * diff -format_number.pdf mac * * agg * diff -format_number.pdf * * * * fontations fuzzy=10,0.1,15 -format_percentage.pdf mac * * agg * diff -format_percentage.pdf * * * * fontations fuzzy=10,0.1,15 -format_special.pdf * nov8 * * * diff -format_text_color.pdf mac * * agg * diff -format_text_color.pdf * * * * fontations fuzzy=10,0.1,15 -formfield.pdf * * * * * diff -getarray.pdf mac * * agg * diff -getarray.pdf * * * * fontations fuzzy=10,0.1,15 +bug_0_width_line.pdf mac * agg * diff +bug_0_width_line.pdf * * * fontations fuzzy=10,0.1,15 +bug_440132.pdf mac * agg * diff +bug_440132.pdf * * * fontations fuzzy=10,0.1,15 +bug_white_space.pdf mac * agg * diff +bug_white_space.pdf * * * fontations fuzzy=10,0.1,15 +calcorderindex_test.pdf * * * * diff +calculate_average.pdf mac * agg * diff +calculate_average.pdf * * * fontations fuzzy=10,0.1,15 +calculate_order.pdf * * * * diff +calculate_sum_a_b_c.pdf mac * agg * diff +calculate_sum_a_b_c.pdf * * * fontations fuzzy=10,0.1,15 +calculate_validate.pdf mac * agg * diff +calculate_validate.pdf * * * fontations fuzzy=10,0.1,15 +calculate_validate.pdf * nov8 * * diff +ch_1.pdf * * * * diff +check_box.pdf * * * * diff +color.pdf mac * agg * diff +color.pdf * * * fontations fuzzy=10,0.1,15 +colorspace.pdf mac * agg * diff +colorspace.pdf * * * fontations fuzzy=10,0.1,15 +colorspace.pdf mac * skia * fuzzy +colorspace_test1.pdf mac * agg * diff +colorspace_test1.pdf * * * fontations fuzzy=10,0.1,15 +colorspace_test1.pdf mac * skia * fuzzy +combo_box.pdf * * * * diff +combo_box_format.pdf mac * agg * diff +combo_box_format.pdf * * * fontations fuzzy=10,0.1,15 +date.pdf mac * agg * diff +date.pdf * * * fontations fuzzy=10,0.1,15 +edit_transform.pdf mac * agg * diff +edit_transform.pdf * * * fontations fuzzy=10,0.1,15 +en_contact.pdf mac * agg * diff +en_contact.pdf * * * fontations fuzzy=10,0.1,15 +en_diy.pdf mac * agg * diff +en_diy.pdf * * * fontations diff +en_foxit.pdf mac * agg * diff +en_foxit.pdf * * * fontations diff +en_fqa2.pdf mac * agg * diff +en_fqa2.pdf * * * fontations fuzzy=10,0.1,15 +en_fqa2.pdf mac * skia * fuzzy +en_introduce.pdf mac * agg * diff +en_introduce.pdf * * * fontations fuzzy=10,0.1,15 +en_tem.pdf mac * agg * diff +en_tem.pdf * * * fontations diff +en_tem.pdf * * * * fuzzy +en_tem.pdf mac * skia * fuzzy +en_uicase_.pdf mac * agg * diff +en_uicase_.pdf * * * fontations fuzzy=10,0.1,15 +en_uicase_.pdf mac * skia * fuzzy +event.change.pdf mac * agg * diff +event.change.pdf * * * fontations fuzzy=10,0.1,15 +event.changeex.pdf mac * agg * diff +event.changeex.pdf * * * fontations fuzzy=10,0.1,15 +event.keydown.pdf mac * agg * diff +event.keydown.pdf * * * fontations fuzzy=10,0.1,15 +event.keydown_1_.pdf mac * agg * diff +event.keydown_1_.pdf * * * fontations fuzzy=10,0.1,15 +event.type_name.pdf mac * agg * diff +event.type_name.pdf * * * fontations fuzzy=10,0.1,15 +event.value.pdf mac * agg * diff +event.value.pdf * * * fontations fuzzy=10,0.1,15 +event_change.pdf mac * agg * diff +event_change.pdf * * * fontations fuzzy=10,0.1,15 +example_001.pdf mac * agg * diff +example_001.pdf * * * fontations diff +example_001.pdf * * * * fuzzy +example_001.pdf mac * skia * fuzzy +example_002.pdf mac * agg * diff +example_002.pdf * * * fontations fuzzy=10,0.1,15 +example_003.pdf mac * agg * diff +example_003.pdf * * * fontations diff +example_003.pdf * * * * fuzzy +example_004.pdf mac * agg * diff +example_004.pdf * * * fontations diff +example_004.pdf * * * * fuzzy +example_005.pdf mac * agg * diff +example_005.pdf * * * fontations diff +example_005.pdf * * * * fuzzy +example_006.pdf mac * agg * diff +example_006.pdf * * * fontations diff +example_006.pdf * * * * fuzzy +example_006.pdf mac * skia * fuzzy +example_007.pdf mac * agg * diff +example_007.pdf * * * fontations diff +example_007.pdf * * * * fuzzy +example_008.pdf mac * agg * diff +example_008.pdf * * * fontations diff +example_008.pdf * * * * fuzzy +example_009.pdf mac * agg * diff +example_009.pdf * * * fontations diff +example_009.pdf * * * * fuzzy=3,0.15,5.0 +example_010.pdf mac * agg * diff +example_010.pdf * * * fontations diff +example_010.pdf * * * * fuzzy +example_010.pdf mac * skia * fuzzy +example_011.pdf mac * agg * diff +example_011.pdf * * * fontations diff +example_011.pdf * * * * fuzzy +example_012.pdf mac * agg * diff +example_012.pdf * * * fontations fuzzy=10,0.1,15 +example_013.pdf mac * agg * diff +example_013.pdf * * * fontations diff +example_013.pdf * * * * fuzzy +example_014.pdf mac * agg * diff +example_014.pdf * * * fontations diff +example_014.pdf * * * * fuzzy +example_015.pdf mac * agg * diff +example_015.pdf * * * fontations diff +example_015.pdf * * * * fuzzy +example_016.pdf mac * agg * diff +example_016.pdf * * * fontations diff +example_016.pdf * * * * fuzzy +example_017.pdf mac * agg * diff +example_017.pdf * * * fontations diff +example_017.pdf * * * * fuzzy +example_018.pdf mac * agg * diff +example_018.pdf * * * fontations diff +example_018.pdf * * * * fuzzy +example_018.pdf mac * skia * fuzzy +example_019.pdf mac * agg * diff +example_019.pdf * * * fontations diff +example_019.pdf * * * * fuzzy +example_020.pdf mac * agg * diff +example_020.pdf * * * fontations diff +example_020.pdf * * * * fuzzy +example_021.pdf mac * agg * diff +example_021.pdf * * * fontations diff +example_021.pdf * * * * fuzzy +example_022.pdf mac * agg * diff +example_022.pdf * * * fontations diff +example_022.pdf * * * * fuzzy +example_023.pdf mac * agg * diff +example_023.pdf * * * fontations diff +example_023.pdf * * * * fuzzy +example_024.pdf mac * agg * diff +example_024.pdf * * * fontations diff +example_024.pdf * * * * fuzzy +example_025.pdf mac * agg * diff +example_025.pdf * * * fontations diff +example_025.pdf * * * * fuzzy +example_025.pdf mac * skia * fuzzy +example_026.pdf mac * agg * diff +example_026.pdf * * * * fuzzy=4,0.05,5.0 +example_027.pdf mac * agg * diff +example_027.pdf * * * fontations diff +example_027.pdf * * * * fuzzy +example_028.pdf mac * agg * diff +example_028.pdf * * * fontations fuzzy=10,0.1,15 +example_029.pdf mac * agg * diff +example_029.pdf * * * fontations diff +example_029.pdf * * * * fuzzy +example_030.pdf mac * agg * diff +example_030.pdf * * * fontations diff +example_030.pdf * * * * fuzzy +example_031.pdf mac * agg * diff +example_031.pdf * * * fontations diff +example_031.pdf * * * * fuzzy +example_032.pdf mac * agg * diff +example_032.pdf * * * fontations diff +example_032.pdf * * * * fuzzy +example_033.pdf mac * agg * diff +example_033.pdf * * * fontations diff +example_033.pdf * * * * fuzzy +example_034.pdf mac * agg * diff +example_034.pdf * * * * fuzzy=4,0.05,5.0 +example_034.pdf * * * fontations fuzzy=10,0.1,15 +example_035.pdf mac * agg * diff +example_035.pdf * * * fontations diff +example_035.pdf * * * * fuzzy +example_036.pdf mac * agg * diff +example_036.pdf * * * fontations diff +example_036.pdf * * * * fuzzy +example_037.pdf mac * agg * diff +example_037.pdf * * * fontations diff +example_037.pdf * * * * fuzzy +example_038.pdf mac * agg * diff +example_038.pdf * * * fontations diff +example_038.pdf * * * * fuzzy +example_039.pdf mac * agg * diff +example_039.pdf * * * fontations diff +example_039.pdf * * * * fuzzy +example_039.pdf mac * skia * fuzzy +example_040.pdf mac * agg * diff +example_040.pdf * * * fontations diff +example_040.pdf * * * * fuzzy +example_040.pdf mac * skia * fuzzy +example_041.pdf mac * agg * diff +example_041.pdf * * * fontations diff +example_041.pdf * * * * fuzzy +example_042.pdf mac * agg * diff +example_042.pdf * * * fontations diff +example_042.pdf * * * * fuzzy +example_043.pdf mac * agg * diff +example_043.pdf * * * fontations diff +example_043.pdf * * * * fuzzy +example_044.pdf mac * agg * diff +example_044.pdf * * * fontations diff +example_044.pdf * * * * fuzzy +example_045.pdf mac * agg * diff +example_045.pdf * * * fontations diff +example_045.pdf * * * * fuzzy +example_046.pdf mac * agg * diff +example_046.pdf * * * fontations diff +example_046.pdf * * * * fuzzy +example_047.pdf mac * agg * diff +example_047.pdf * * * fontations diff +example_047.pdf * * * * fuzzy +example_048.pdf mac * agg * diff +example_048.pdf * * * fontations diff +example_048.pdf * * * * fuzzy +example_049.pdf mac * agg * diff +example_049.pdf * * * fontations diff +example_049.pdf * * * * fuzzy +example_050.pdf mac * agg * diff +example_050.pdf * * * fontations diff +example_050.pdf * * * * fuzzy +example_051.pdf mac * agg * diff +example_051.pdf * * * * fuzzy=3,0.35,5.0 +example_051.pdf * * * fontations fuzzy=10,0.35,15 +example_052.pdf mac * agg * diff +example_052.pdf * * * fontations diff +example_052.pdf * * * * fuzzy +example_053.pdf mac * agg * diff +example_053.pdf * * * fontations diff +example_053.pdf * * * * fuzzy +example_054.pdf mac * agg * diff +example_054.pdf * * * fontations diff +example_054.pdf * * * * fuzzy +example_055.pdf mac * agg * diff +example_055.pdf * * * fontations diff +example_055.pdf * * * * fuzzy +example_056.pdf mac * agg * diff +example_056.pdf * * * fontations diff +example_056.pdf * * * * fuzzy +example_057.pdf mac * agg * diff +example_057.pdf * * * fontations diff +example_057.pdf * * * * fuzzy +example_057.pdf mac * skia * fuzzy +example_058.pdf mac * agg * diff +example_058.pdf * * * fontations diff +example_058.pdf * * * * fuzzy +example_058.pdf mac * skia * fuzzy +example_059.pdf mac * agg * diff +example_059.pdf * * * fontations diff +example_059.pdf * * * * fuzzy +example_060.pdf mac * agg * diff +example_060.pdf * * * fontations diff +example_060.pdf * * * * fuzzy +example_060.pdf mac * skia * fuzzy +example_061.pdf mac * agg * diff +example_061.pdf * * * fontations diff +example_061.pdf * * * * fuzzy +example_062.pdf mac * agg * diff +example_062.pdf * * * * fuzzy=4,0.05,5.0 +example_062.pdf * * * fontations fuzzy=10,0.1,15 +example_063.pdf mac * agg * diff +example_063.pdf * * * fontations diff +example_063.pdf * * * * fuzzy +example_063.pdf mac * skia * fuzzy +example_064.pdf mac * agg * diff +example_064.pdf * * * fontations diff +example_064.pdf * * * * fuzzy +example_064.pdf mac * skia * fuzzy +example_065.pdf mac * agg * diff +example_065.pdf * * * fontations fuzzy=15,0.05,15 +example_065.pdf * * * * fuzzy +fillform.pdf * * * * diff +form_action_trigger.pdf * * * * diff +form_button_sign_url.pdf * * * * diff +form_combo_sign_url.pdf * * * * diff +form_combobox0.pdf * * * * diff +form_combobox_actioin_goto.pdf * * * * diff +form_combobox_date.pdf mac * agg * diff +form_combobox_date.pdf * * * fontations fuzzy=10,0.1,15 +form_combobox_date.pdf * nov8 * * diff +form_combobox_date1.pdf * * * * diff +form_combobox_date2.pdf mac * agg * diff +form_combobox_date2.pdf * * * fontations fuzzy=10,0.1,15 +form_combobox_date2.pdf * nov8 * * diff +form_combobox_importform.pdf * * * * diff +form_combobox_num.pdf mac * agg * diff +form_combobox_num.pdf * * * fontations fuzzy=10,0.1,15 +form_combobox_num.pdf * nov8 * * diff +form_combobox_per.pdf mac * agg * diff +form_combobox_per.pdf * * * fontations fuzzy=10,0.1,15 +form_combobox_per.pdf * nov8 * * diff +form_combobox_plus.pdf mac * agg * diff +form_combobox_plus.pdf * * * fontations fuzzy=10,0.1,15 +form_combobox_plus.pdf * nov8 * * diff +form_combobox_product.pdf mac * agg * diff +form_combobox_product.pdf * * * fontations fuzzy=10,0.1,15 +form_combobox_product.pdf * nov8 * * diff +form_combobox_resetform.pdf * * * * diff +form_combobox_time.pdf mac * agg * diff +form_combobox_time.pdf * * * fontations fuzzy=10,0.1,15 +form_combobox_time.pdf * nov8 * * diff +form_list.pdf * * * * diff +form_list1.pdf * * * * diff +form_same.pdf mac * agg * diff +form_same.pdf * * * fontations diff +form_text_sign_url.pdf * * * * diff +format_combo_box.pdf mac * agg * diff +format_combo_box.pdf * * * fontations fuzzy=10,0.1,15 +format_combo_box.pdf * nov8 * * diff +format_custom_format.pdf * nov8 agg * diff +format_custom_format.pdf * * * fontations fuzzy=10,0.1,15 +format_custom_keystroke.pdf * * * * diff +format_date.pdf * nov8 * * diff +format_number.pdf mac * agg * diff +format_number.pdf * * * fontations fuzzy=10,0.1,15 +format_percentage.pdf mac * agg * diff +format_percentage.pdf * * * fontations fuzzy=10,0.1,15 +format_special.pdf * nov8 * * diff +format_text_color.pdf mac * agg * diff +format_text_color.pdf * * * fontations fuzzy=10,0.1,15 +formfield.pdf * * * * diff +getarray.pdf mac * agg * diff +getarray.pdf * * * fontations fuzzy=10,0.1,15 # TODO(crbug.com/42271468): Remove after associated bug is fixed. -gradient_many_stops.pdf * * * agg * diff +gradient_many_stops.pdf * * agg * diff -javascriptaction.pdf * * * * * diff -jetman_std.pdf mac * * agg * diff -jetman_std.pdf * * * * fontations fuzzy=10,0.1,15 -jetman_std_fixed.pdf mac * * agg * diff -jetman_std_fixed.pdf * * * * fontations fuzzy=10,0.1,15 -js_calculate.pdf * * * * * diff -list_box.pdf * * * * * diff -negative.pdf mac * * agg * diff -negative.pdf * * * * fontations fuzzy=10,0.1,15 -new_certify1.pdf mac * * agg * diff -new_certify1.pdf * * * * fontations fuzzy=10,0.1,15 -new_signature1.pdf mac * * agg * diff -new_signature1.pdf * * * * fontations fuzzy=10,0.1,15 -new_signature2.pdf mac * * agg * diff -new_signature2.pdf * * * * fontations fuzzy=10,0.1,15 -new_stamp4.pdf mac * * agg * diff -new_stamp4.pdf * * * * fontations fuzzy=10,0.1,15 -new_stamp5.pdf mac * * agg * diff -new_stamp5.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup1.pdf mac * * agg * diff -new_textmarkup1.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup1_hidden.pdf mac * * agg * diff -new_textmarkup1_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup2.pdf mac * * agg * diff -new_textmarkup2.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup2.pdf mac * * skia * fuzzy -new_textmarkup2_hidden.pdf mac * * agg * diff -new_textmarkup2_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup4.pdf mac * * agg * diff -new_textmarkup4.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup4_hidden.pdf mac * * agg * diff -new_textmarkup4_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup5.pdf mac * * agg * diff -new_textmarkup5.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup5_hidden.pdf mac * * agg * diff -new_textmarkup5_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup6.pdf mac * * agg * diff -new_textmarkup6.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup7.pdf mac * * agg * diff -new_textmarkup7.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup7_hidden.pdf mac * * agg * diff -new_textmarkup7_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup8.pdf mac * * agg * diff -new_textmarkup8.pdf * * * * fontations fuzzy=10,0.1,15 -new_textmarkup8.pdf mac * * skia * fuzzy -new_textmarkup8_hidden.pdf mac * * agg * diff -new_textmarkup8_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -number.pdf * * * * * diff -octest.pdf mac * * agg * diff -octest.pdf * * * * fontations fuzzy=10,0.1,15 -open_a_weblink.pdf mac * * agg * diff -open_a_weblink.pdf * * * * fontations fuzzy=10,0.1,15 -path_10_jd.pdf mac * * agg * diff -path_10_jd.pdf * * * * fontations fuzzy=10,0.1,15 -path_5_pattern.pdf mac * * agg * diff -path_5_pattern.pdf * * * * fontations fuzzy=10,0.1,15 -path_5_pattern.pdf mac * * skia * fuzzy -path_6_graphics4.5.5.pdf mac * * agg * diff -path_6_graphics4.5.5.pdf * * * * fontations fuzzy=10,0.1,15 -path_7.pdf mac * * agg * diff -path_7.pdf * * * * fontations diff -path_9.pdf mac * * agg * diff -path_9.pdf * * * * fontations diff -path_9.pdf mac_x86 * * skia * fuzzy -percentage.pdf mac * * agg * diff -percentage.pdf * * * * fontations fuzzy=10,0.1,15 -push_button.pdf * * * * * diff -quick_start_guide.pdf mac * * agg * diff -quick_start_guide.pdf * * * * fontations diff -quick_start_guide.pdf * * * * * fuzzy=4,0.05,5.0 -radio_button.pdf * * * * * diff -run_custom_validate_script.pdf * * * * * diff -show_1.pdf mac * * agg * diff -show_1.pdf * * * * fontations fuzzy=10,0.1,15 -signature.pdf * * * * * diff -signature_4.pdf * * * * * diff -simplified_field_notation.pdf mac * * agg * diff -simplified_field_notation.pdf * * * * fontations fuzzy=10,0.1,15 -special.pdf mac * * agg * diff -special.pdf * * * * fontations fuzzy=10,0.1,15 -submit_form.pdf mac * * agg * diff -submit_form.pdf * * * * fontations fuzzy=10,0.1,15 -test_app_beep.pdf * * * * * diff -test_control.pdf * * * * * diff -text_field.pdf * * * * * diff -text_field_font_input_decimal_point.pdf mac * * agg * diff -text_field_font_input_decimal_point.pdf * * * * fontations fuzzy=10,0.1,15 -text_field_multiline_line_spacing.pdf mac * * agg * diff -text_field_multiline_line_spacing.pdf * * * * fontations fuzzy=10,0.1,15 -thread_action.pdf mac * * agg * diff -thread_action.pdf * * * * fontations fuzzy=10,0.1,15 -time.pdf mac * * agg * diff -time.pdf * * * * fontations fuzzy=10,0.1,15 -transformation.pdf mac * * agg * diff -transformation.pdf * * * * fontations fuzzy=10,0.1,15 -transparent.pdf mac * * agg * diff -transparent.pdf * * * * fontations fuzzy=10,0.1,15 -whats_new_in_v3.0.pdf mac * * agg * diff -whats_new_in_v3.0.pdf * * * * fontations fuzzy=10,0.1,15 -whats_new_in_v3.0.pdf mac * * skia * fuzzy -widget_javascript.pdf mac * * agg * diff -widget_javascript.pdf * * * * fontations fuzzy=10,0.1,15 +javascriptaction.pdf * * * * diff +jetman_std.pdf mac * agg * diff +jetman_std.pdf * * * fontations fuzzy=10,0.1,15 +jetman_std_fixed.pdf mac * agg * diff +jetman_std_fixed.pdf * * * fontations fuzzy=10,0.1,15 +js_calculate.pdf * * * * diff +list_box.pdf * * * * diff +negative.pdf mac * agg * diff +negative.pdf * * * fontations fuzzy=10,0.1,15 +new_certify1.pdf mac * agg * diff +new_certify1.pdf * * * fontations fuzzy=10,0.1,15 +new_signature1.pdf mac * agg * diff +new_signature1.pdf * * * fontations fuzzy=10,0.1,15 +new_signature2.pdf mac * agg * diff +new_signature2.pdf * * * fontations fuzzy=10,0.1,15 +new_stamp4.pdf mac * agg * diff +new_stamp4.pdf * * * fontations fuzzy=10,0.1,15 +new_stamp5.pdf mac * agg * diff +new_stamp5.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup1.pdf mac * agg * diff +new_textmarkup1.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup1_hidden.pdf mac * agg * diff +new_textmarkup1_hidden.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup2.pdf mac * agg * diff +new_textmarkup2.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup2.pdf mac * skia * fuzzy +new_textmarkup2_hidden.pdf mac * agg * diff +new_textmarkup2_hidden.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup4.pdf mac * agg * diff +new_textmarkup4.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup4_hidden.pdf mac * agg * diff +new_textmarkup4_hidden.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup5.pdf mac * agg * diff +new_textmarkup5.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup5_hidden.pdf mac * agg * diff +new_textmarkup5_hidden.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup6.pdf mac * agg * diff +new_textmarkup6.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup7.pdf mac * agg * diff +new_textmarkup7.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup7_hidden.pdf mac * agg * diff +new_textmarkup7_hidden.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup8.pdf mac * agg * diff +new_textmarkup8.pdf * * * fontations fuzzy=10,0.1,15 +new_textmarkup8.pdf mac * skia * fuzzy +new_textmarkup8_hidden.pdf mac * agg * diff +new_textmarkup8_hidden.pdf * * * fontations fuzzy=10,0.1,15 +number.pdf * * * * diff +octest.pdf mac * agg * diff +octest.pdf * * * fontations fuzzy=10,0.1,15 +open_a_weblink.pdf mac * agg * diff +open_a_weblink.pdf * * * fontations fuzzy=10,0.1,15 +path_10_jd.pdf mac * agg * diff +path_10_jd.pdf * * * fontations fuzzy=10,0.1,15 +path_5_pattern.pdf mac * agg * diff +path_5_pattern.pdf * * * fontations fuzzy=10,0.1,15 +path_5_pattern.pdf mac * skia * fuzzy +path_6_graphics4.5.5.pdf mac * agg * diff +path_6_graphics4.5.5.pdf * * * fontations fuzzy=10,0.1,15 +path_7.pdf mac * agg * diff +path_7.pdf * * * fontations diff +path_9.pdf mac * agg * diff +path_9.pdf * * * fontations diff +path_9.pdf mac_x86 * skia * fuzzy +percentage.pdf mac * agg * diff +percentage.pdf * * * fontations fuzzy=10,0.1,15 +push_button.pdf * * * * diff +quick_start_guide.pdf mac * agg * diff +quick_start_guide.pdf * * * fontations diff +quick_start_guide.pdf * * * * fuzzy=4,0.05,5.0 +radio_button.pdf * * * * diff +run_custom_validate_script.pdf * * * * diff +show_1.pdf mac * agg * diff +show_1.pdf * * * fontations fuzzy=10,0.1,15 +signature.pdf * * * * diff +signature_4.pdf * * * * diff +simplified_field_notation.pdf mac * agg * diff +simplified_field_notation.pdf * * * fontations fuzzy=10,0.1,15 +special.pdf mac * agg * diff +special.pdf * * * fontations fuzzy=10,0.1,15 +submit_form.pdf mac * agg * diff +submit_form.pdf * * * fontations fuzzy=10,0.1,15 +test_app_beep.pdf * * * * diff +test_control.pdf * * * * diff +text_field.pdf * * * * diff +text_field_font_input_decimal_point.pdf mac * agg * diff +text_field_font_input_decimal_point.pdf * * * fontations fuzzy=10,0.1,15 +text_field_multiline_line_spacing.pdf mac * agg * diff +text_field_multiline_line_spacing.pdf * * * fontations fuzzy=10,0.1,15 +thread_action.pdf mac * agg * diff +thread_action.pdf * * * fontations fuzzy=10,0.1,15 +time.pdf mac * agg * diff +time.pdf * * * fontations fuzzy=10,0.1,15 +transformation.pdf mac * agg * diff +transformation.pdf * * * fontations fuzzy=10,0.1,15 +transparent.pdf mac * agg * diff +transparent.pdf * * * fontations fuzzy=10,0.1,15 +whats_new_in_v3.0.pdf mac * agg * diff +whats_new_in_v3.0.pdf * * * fontations fuzzy=10,0.1,15 +whats_new_in_v3.0.pdf mac * skia * fuzzy +widget_javascript.pdf mac * agg * diff +widget_javascript.pdf * * * fontations fuzzy=10,0.1,15 # TODO(crbug.com/42270997): Remove after associated bug is fixed -xfermodes2.pdf * * * agg * diff -xfermodes2.pdf * * * skia * fuzzy +xfermodes2.pdf * * agg * diff +xfermodes2.pdf * * skia * fuzzy -zh_file1.pdf mac * * agg * diff -zh_file1.pdf * * * * fontations diff -zh_function_list.pdf mac * * agg * diff -zh_function_list.pdf * * * * fontations diff -zh_function_list.pdf mac * * skia * fuzzy -zh_shared_document.pdf mac * * agg * diff -zh_shared_document.pdf * * * * fontations diff +zh_file1.pdf mac * agg * diff +zh_file1.pdf * * * fontations diff +zh_function_list.pdf mac * agg * diff +zh_function_list.pdf * * * fontations diff +zh_function_list.pdf mac * skia * fuzzy +zh_shared_document.pdf mac * agg * diff +zh_shared_document.pdf * * * fontations diff # TODO(hnakashima): These might never have been run. Go over them and fix. -FRC_8.5_E&X.pdf * * * * * diff -FRC_8.5_O&PO_GoToE.pdf * * * * * diff -FRC_8.5_OpenAction&O_URI.pdf * * * * * diff -FRC_8.5_PC&C_GoToE_T_T.pdf * * * * * diff -FRC_8.5_PC_GoToE_T_R&P&A.pdf * * * * * diff -FRC_8.5_PO_GoToE_T_R&N.pdf * * * * * diff +FRC_8.5_E&X.pdf * * * * diff +FRC_8.5_O&PO_GoToE.pdf * * * * diff +FRC_8.5_OpenAction&O_URI.pdf * * * * diff +FRC_8.5_PC&C_GoToE_T_T.pdf * * * * diff +FRC_8.5_PC_GoToE_T_R&P&A.pdf * * * * diff +FRC_8.5_PO_GoToE_T_R&N.pdf * * * * diff # xfa_specific -Choose.pdf * * * * * diff -data_binding.pdf * * * * * diff +Choose.pdf * * * * diff +data_binding.pdf * * * * diff # TODO(crbug.com/567626109): Add proper evt for MouseEvents. -MouseEvents_enter.pdf * * * * * diff -MouseEvents_exit.pdf * * * * * diff -Oneof3.pdf * * * * * diff -Sum.pdf * * * * * diff -Test_CheckBox.pdf * * * * * diff +MouseEvents_enter.pdf * * * * diff +MouseEvents_exit.pdf * * * * diff +Oneof3.pdf * * * * diff +Sum.pdf * * * * diff +Test_CheckBox.pdf * * * * diff # TODO(crbug.com/459586268): Remove this entry once macOS support for Intel # hardware goes away. The test expectation is just different enough from the ARM # rendering that fuzzy matching is not enough for it to match. -2_color_calrgb.pdf mac_x86 * * skia * diff -2_color_tiling.pdf mac_x86 * * skia * diff -2_color_tiling.pdf * * * * fontations fuzzy=10,0.1,15 -2_uncolor_tiling.pdf mac_x86 * * skia * diff -2_uncolor_tiling.pdf * * * * fontations fuzzy=10,0.1,15 -3bigpreview.pdf mac_x86 * * skia * diff -FRC_4.5.3_DeviceRGB_rg.pdf mac_x86 * * skia * diff -FRC_4.5.4_CalGray_gamma.pdf mac_x86 * * skia * diff -FRC_4.5.4_CalGray_whitepoint.pdf mac_x86 * * skia * diff -FRC_4.5.4_CalRGB_gamma.pdf mac_x86 * * skia * diff -FRC_4.5.4_CalRGB_matrix.pdf mac_x86 * * skia * diff -FRC_4.5.4_CalRGB_whitepoint.pdf mac_x86 * * skia * diff -FRC_4.5.4_Lab.pdf mac_x86 * * skia * diff -FRC_4.5.4_RI_Relative.pdf mac_x86 * * skia * diff -FRC_10_8.2.4_View_C.pdf mac_x86 * * skia * diff -FRC_10_8.2.4_View_C.pdf * * * * fontations fuzzy=10,0.1,15 -Test_DateField_locale_zh_HK.pdf mac_x86 * * skia * diff -Test_DateField_locale_zh_HK.pdf * * * * fontations fuzzy=10,0.1,15 -TimeField.pdf mac_x86 * * skia * diff -annotation_circle_hidden.pdf mac_x86 * * skia * diff -annotation_circle_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_ellipse_hidden.pdf mac_x86 * * skia * diff -annotation_ellipse_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_highlight.pdf mac_x86 * * skia * diff -annotation_highlight.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_highlight_empty_content.pdf mac_x86 * * skia * diff -annotation_highlight_empty_content.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_highlight_hidden.pdf mac_x86 * * skia * diff -annotation_highlight_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_highlight_no_author_no_content.pdf mac_x86 * * skia * diff -annotation_highlight_no_author_no_content.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_highlight_no_content.pdf mac_x86 * * skia * diff -annotation_highlight_opacity.pdf mac_x86 * * skia * diff -annotation_highlight_opacity.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_ink_hidden.pdf mac_x86 * * skia * diff -annotation_ink_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_polygon.pdf mac_x86 * * skia * diff -annotation_polygon.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_square_fill_negative_border.pdf mac_x86 * * skia * diff -annotation_square_fill_negative_border.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_square_hidden.pdf mac_x86 * * skia * diff -annotation_square_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_squiggly_hidden.pdf mac_x86 * * skia * diff -annotation_squiggly_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_stamp.pdf mac_x86 * * skia * diff -annotation_stamp.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_strikeout_hidden.pdf mac_x86 * * skia * diff -annotation_strikeout_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_strikeout_opacity.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_strikeout_opacity.pdf mac * * skia * fuzzy -annotation_underline.pdf mac_x86 * * skia * diff -annotation_underline.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_underline_hidden.pdf mac_x86 * * skia * diff -annotation_underline_hidden.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_underline_opacity.pdf mac_x86 * * skia * diff -annotation_underline_opacity.pdf * * * * fontations fuzzy=10,0.1,15 -bug_668762.pdf mac_x86 * * skia * diff -bug_668762.pdf * * * * fontations fuzzy=10,0.1,15 -edit_transform.pdf mac_x86 * * skia * diff -en_14_foxit_products.pdf mac_x86 * * skia * diff -en_14_foxit_products.pdf * * * * fontations fuzzy=10,0.2,15 -en_contact.pdf mac_x86 * * skia * diff -en_foxit.pdf mac_x86 * * skia * diff -en_fqa.pdf mac_x86 * * skia * diff -en_fqa.pdf * * * * fontations fuzzy=10,0.1,15 -example_002.pdf mac_x86 * * skia * diff -example_004.pdf mac_x86 * * skia * diff -example_028.pdf mac_x86 * * skia * diff -example_055.pdf mac_x86 * * skia * diff -font_1_embedded_font_en_feature.pdf mac_x86 * * skia * diff -font_1_embedded_font_en_feature.pdf * * * * fontations diff -font_2_embedded_font_en_size14.pdf mac_x86 * * skia * diff -font_2_embedded_font_en_size14.pdf * * * * fontations diff -new_stamp4.pdf mac_x86 * * skia * diff -octest.pdf mac_x86 * * skia * diff -path_5_pattern.pdf mac_x86 * * skia * diff -path_6_graphics4.5.5.pdf mac_x86 * * skia * diff -path_7.pdf mac_x86 * * skia * diff -quick_start_guide.pdf mac_x86 * * skia * diff -transparent1.pdf mac_x86 * * skia * diff -xfermodes.pdf mac_x86 * * skia * diff -xfermodes.pdf * * * skia * fuzzy -xfermodes2.pdf mac_x86 * * skia * diff -xfermodes3.pdf * * * skia * fuzzy -zh_function_list.pdf mac_x86 * * skia * diff +2_color_calrgb.pdf mac_x86 * skia * diff +2_color_tiling.pdf mac_x86 * skia * diff +2_color_tiling.pdf * * * fontations fuzzy=10,0.1,15 +2_uncolor_tiling.pdf mac_x86 * skia * diff +2_uncolor_tiling.pdf * * * fontations fuzzy=10,0.1,15 +3bigpreview.pdf mac_x86 * skia * diff +FRC_4.5.3_DeviceRGB_rg.pdf mac_x86 * skia * diff +FRC_4.5.4_CalGray_gamma.pdf mac_x86 * skia * diff +FRC_4.5.4_CalGray_whitepoint.pdf mac_x86 * skia * diff +FRC_4.5.4_CalRGB_gamma.pdf mac_x86 * skia * diff +FRC_4.5.4_CalRGB_matrix.pdf mac_x86 * skia * diff +FRC_4.5.4_CalRGB_whitepoint.pdf mac_x86 * skia * diff +FRC_4.5.4_Lab.pdf mac_x86 * skia * diff +FRC_4.5.4_RI_Relative.pdf mac_x86 * skia * diff +FRC_10_8.2.4_View_C.pdf mac_x86 * skia * diff +FRC_10_8.2.4_View_C.pdf * * * fontations fuzzy=10,0.1,15 +Test_DateField_locale_zh_HK.pdf mac_x86 * skia * diff +Test_DateField_locale_zh_HK.pdf * * * fontations fuzzy=10,0.1,15 +TimeField.pdf mac_x86 * skia * diff +annotation_circle_hidden.pdf mac_x86 * skia * diff +annotation_circle_hidden.pdf * * * fontations fuzzy=10,0.1,15 +annotation_ellipse_hidden.pdf mac_x86 * skia * diff +annotation_ellipse_hidden.pdf * * * fontations fuzzy=10,0.1,15 +annotation_highlight.pdf mac_x86 * skia * diff +annotation_highlight.pdf * * * fontations fuzzy=10,0.1,15 +annotation_highlight_empty_content.pdf mac_x86 * skia * diff +annotation_highlight_empty_content.pdf * * * fontations fuzzy=10,0.1,15 +annotation_highlight_hidden.pdf mac_x86 * skia * diff +annotation_highlight_hidden.pdf * * * fontations fuzzy=10,0.1,15 +annotation_highlight_no_author_no_content.pdf mac_x86 * skia * diff +annotation_highlight_no_author_no_content.pdf * * * fontations fuzzy=10,0.1,15 +annotation_highlight_no_content.pdf mac_x86 * skia * diff +annotation_highlight_opacity.pdf mac_x86 * skia * diff +annotation_highlight_opacity.pdf * * * fontations fuzzy=10,0.1,15 +annotation_ink_hidden.pdf mac_x86 * skia * diff +annotation_ink_hidden.pdf * * * fontations fuzzy=10,0.1,15 +annotation_polygon.pdf mac_x86 * skia * diff +annotation_polygon.pdf * * * fontations fuzzy=10,0.1,15 +annotation_square_fill_negative_border.pdf mac_x86 * skia * diff +annotation_square_fill_negative_border.pdf * * * fontations fuzzy=10,0.1,15 +annotation_square_hidden.pdf mac_x86 * skia * diff +annotation_square_hidden.pdf * * * fontations fuzzy=10,0.1,15 +annotation_squiggly_hidden.pdf mac_x86 * skia * diff +annotation_squiggly_hidden.pdf * * * fontations fuzzy=10,0.1,15 +annotation_stamp.pdf mac_x86 * skia * diff +annotation_stamp.pdf * * * fontations fuzzy=10,0.1,15 +annotation_strikeout_hidden.pdf mac_x86 * skia * diff +annotation_strikeout_hidden.pdf * * * fontations fuzzy=10,0.1,15 +annotation_strikeout_opacity.pdf * * * fontations fuzzy=10,0.1,15 +annotation_strikeout_opacity.pdf mac * skia * fuzzy +annotation_underline.pdf mac_x86 * skia * diff +annotation_underline.pdf * * * fontations fuzzy=10,0.1,15 +annotation_underline_hidden.pdf mac_x86 * skia * diff +annotation_underline_hidden.pdf * * * fontations fuzzy=10,0.1,15 +annotation_underline_opacity.pdf mac_x86 * skia * diff +annotation_underline_opacity.pdf * * * fontations fuzzy=10,0.1,15 +bug_668762.pdf mac_x86 * skia * diff +bug_668762.pdf * * * fontations fuzzy=10,0.1,15 +edit_transform.pdf mac_x86 * skia * diff +en_14_foxit_products.pdf mac_x86 * skia * diff +en_14_foxit_products.pdf * * * fontations fuzzy=10,0.2,15 +en_contact.pdf mac_x86 * skia * diff +en_foxit.pdf mac_x86 * skia * diff +en_fqa.pdf mac_x86 * skia * diff +en_fqa.pdf * * * fontations fuzzy=10,0.1,15 +example_002.pdf mac_x86 * skia * diff +example_004.pdf mac_x86 * skia * diff +example_028.pdf mac_x86 * skia * diff +example_055.pdf mac_x86 * skia * diff +font_1_embedded_font_en_feature.pdf mac_x86 * skia * diff +font_1_embedded_font_en_feature.pdf * * * fontations diff +font_2_embedded_font_en_size14.pdf mac_x86 * skia * diff +font_2_embedded_font_en_size14.pdf * * * fontations diff +new_stamp4.pdf mac_x86 * skia * diff +octest.pdf mac_x86 * skia * diff +path_5_pattern.pdf mac_x86 * skia * diff +path_6_graphics4.5.5.pdf mac_x86 * skia * diff +path_7.pdf mac_x86 * skia * diff +quick_start_guide.pdf mac_x86 * skia * diff +transparent1.pdf mac_x86 * skia * diff +xfermodes.pdf mac_x86 * skia * diff +xfermodes.pdf * * skia * fuzzy +xfermodes2.pdf mac_x86 * skia * diff +xfermodes3.pdf * * skia * fuzzy +zh_function_list.pdf mac_x86 * skia * diff # GDI # TODO(crbug.com/42271066): Remove after associated bug is fixed -1.pdf * * * gdi * diff -1.pdf * * * * * fuzzy -1.pdf mac * * skia * fuzzy -123.pdf * * * gdi * diff -123.pdf mac * * skia * fuzzy -1_image.pdf * * * gdi * diff -1_image.pdf mac * * skia * fuzzy -3_interpolate_image.pdf * * * gdi * diff -3bigpreview.pdf * * * gdi * diff -4_3.pdf * * * gdi * diff -4_3.pdf mac * * skia * fuzzy -4_36.pdf * * * gdi * diff -4_36.pdf mac * * skia * fuzzy -FRC_10_8.2.4_View_C.pdf * * * gdi * diff -FRC_8.4.1_Annotations_Type.pdf * * * gdi * diff -FRC_8.4.1_Annotations_Type.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_W_different_values.pdf * * * gdi * diff -FRC_8.4.3_Border_Stypes_W_different_values.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_Screen_Img_D_Launch.pdf * * * gdi * diff -FRC_8.5_Screen_Img_D_Launch.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_Screen_Img_D_Launch.pdf mac * * skia * fuzzy -FRC_8.5_URI_IsMap.pdf * * * gdi * diff -FRC_8.5_URI_IsMap.pdf * * * * * fuzzy -FRC_8.5_URI_IsMap.pdf mac * * skia * fuzzy -FRC_8.5_URI_IsMap.pdf * * * * fontations fuzzy=10,0.1,15 -bug_691967.pdf * * * gdi_skia * diff -bug_691967.pdf * * * * * fuzzy -bug_691967.pdf mac * * skia * fuzzy -bug_691967.pdf * * * * fontations fuzzy=10,0.1,15 -bug_86459.pdf * * * gdi * diff -bug_86459.pdf * * * * * fuzzy -bug_880920.pdf * * * gdi * diff -ch_7_0.pdf * * * gdi * diff -ch_7_0.pdf * * * * * fuzzy -ch_7_1.pdf * * * gdi * diff -ch_7_1.pdf * * * * * fuzzy -ch_7_4.pdf * * * gdi * diff -ch_7_4.pdf * * * * * fuzzy -ch_7_5.pdf * * * gdi * diff -ch_7_5.pdf * * * * * fuzzy -ch_7_6.pdf * * * gdi * diff -ch_7_6.pdf * * * * * fuzzy -ch_7_7.pdf * * * gdi * diff -ch_7_7.pdf * * * * * fuzzy -ch_7_8.pdf * * * gdi * diff -ch_7_8.pdf * * * * * fuzzy -en_tem.pdf * * * gdi * diff -example_001.pdf * * * gdi * diff -example_003.pdf * * * gdi * diff -example_004.pdf * * * gdi * diff -example_005.pdf * * * gdi * diff -example_006.pdf * * * gdi * diff -example_007.pdf * * * gdi * diff -example_008.pdf * * * gdi * diff -example_009.pdf * * * gdi * diff -example_010.pdf * * * gdi * diff -example_011.pdf * * * gdi * diff -example_013.pdf * * * gdi * diff -example_015.pdf * * * gdi * diff -example_016.pdf * * * gdi * diff -example_017.pdf * * * gdi * diff -example_018.pdf * * * gdi * diff -example_019.pdf * * * gdi * diff -example_020.pdf * * * gdi * diff -example_021.pdf * * * gdi * diff -example_022.pdf * * * gdi * diff -example_023.pdf * * * gdi * diff -example_024.pdf * * * gdi * diff -example_025.pdf * * * gdi * diff -example_026.pdf * * * gdi * diff -example_027.pdf * * * gdi * diff -example_029.pdf * * * gdi * diff -example_030.pdf * * * gdi * diff -example_031.pdf * * * gdi * diff -example_032.pdf * * * gdi * diff -example_033.pdf * * * gdi * diff -example_034.pdf * * * gdi * diff -example_035.pdf * * * gdi * diff -example_036.pdf * * * gdi * diff -example_037.pdf * * * gdi * diff -example_038.pdf * * * gdi * diff -example_039.pdf * * * gdi * diff -example_040.pdf * * * gdi * diff -example_041.pdf * * * gdi * diff -example_042.pdf * * * gdi * diff -example_043.pdf * * * gdi * diff -example_044.pdf * * * gdi * diff -example_045.pdf * * * gdi * diff -example_046.pdf * * * gdi * diff -example_047.pdf * * * gdi * diff -example_048.pdf * * * gdi * diff -example_049.pdf * * * gdi * diff -example_050.pdf * * * gdi * diff -example_051.pdf * * * gdi * diff -example_052.pdf * * * gdi * diff -example_053.pdf * * * gdi * diff -example_055.pdf * * * gdi * diff -example_056.pdf * * * gdi * diff -example_057.pdf * * * gdi * diff -example_058.pdf * * * gdi * diff -example_059.pdf * * * gdi * diff -example_060.pdf * * * gdi * diff -example_061.pdf * * * gdi * diff -example_062.pdf * * * gdi * diff -example_063.pdf * * * gdi * diff -example_064.pdf * * * gdi * diff -example_065.pdf * * * gdi * diff -image_8bit_devicergb_dctdecode.pdf * * * gdi * diff -image_8bit_devicergb_dctdecode.pdf * * * * * fuzzy -image_8bit_devicergb_dctdecode.pdf mac * * skia * fuzzy -image_bmp.pdf * * * gdi * diff -image_bmp.pdf * * * * * fuzzy -image_bmp.pdf mac * * skia * fuzzy -image_jpg.pdf * * * gdi * diff -image_jpg.pdf * * * * * fuzzy -image_jpg.pdf mac * * skia * fuzzy -image_png.pdf * * * gdi * diff -image_png.pdf mac * * skia * fuzzy -image_tif.pdf * * * gdi * diff -image_tif.pdf * * * * * fuzzy=10,0.05,10.0 -mask_array.pdf * * * gdi * diff -new_stamp2.pdf * * * gdi * diff -quick_start_guide.pdf * * * gdi * diff -whats_new_in_v3.0.pdf * * * gdi * diff +1.pdf * * gdi * diff +1.pdf * * * * fuzzy +1.pdf mac * skia * fuzzy +123.pdf * * gdi * diff +123.pdf mac * skia * fuzzy +1_image.pdf * * gdi * diff +1_image.pdf mac * skia * fuzzy +3_interpolate_image.pdf * * gdi * diff +3bigpreview.pdf * * gdi * diff +4_3.pdf * * gdi * diff +4_3.pdf mac * skia * fuzzy +4_36.pdf * * gdi * diff +4_36.pdf mac * skia * fuzzy +FRC_10_8.2.4_View_C.pdf * * gdi * diff +FRC_8.4.1_Annotations_Type.pdf * * gdi * diff +FRC_8.4.1_Annotations_Type.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_W_different_values.pdf * * gdi * diff +FRC_8.4.3_Border_Stypes_W_different_values.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_Screen_Img_D_Launch.pdf * * gdi * diff +FRC_8.5_Screen_Img_D_Launch.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_Screen_Img_D_Launch.pdf mac * skia * fuzzy +FRC_8.5_URI_IsMap.pdf * * gdi * diff +FRC_8.5_URI_IsMap.pdf * * * * fuzzy +FRC_8.5_URI_IsMap.pdf mac * skia * fuzzy +FRC_8.5_URI_IsMap.pdf * * * fontations fuzzy=10,0.1,15 +bug_691967.pdf * * gdi_skia * diff +bug_691967.pdf * * * * fuzzy +bug_691967.pdf mac * skia * fuzzy +bug_691967.pdf * * * fontations fuzzy=10,0.1,15 +bug_86459.pdf * * gdi * diff +bug_86459.pdf * * * * fuzzy +bug_880920.pdf * * gdi * diff +ch_7_0.pdf * * gdi * diff +ch_7_0.pdf * * * * fuzzy +ch_7_1.pdf * * gdi * diff +ch_7_1.pdf * * * * fuzzy +ch_7_4.pdf * * gdi * diff +ch_7_4.pdf * * * * fuzzy +ch_7_5.pdf * * gdi * diff +ch_7_5.pdf * * * * fuzzy +ch_7_6.pdf * * gdi * diff +ch_7_6.pdf * * * * fuzzy +ch_7_7.pdf * * gdi * diff +ch_7_7.pdf * * * * fuzzy +ch_7_8.pdf * * gdi * diff +ch_7_8.pdf * * * * fuzzy +en_tem.pdf * * gdi * diff +example_001.pdf * * gdi * diff +example_003.pdf * * gdi * diff +example_004.pdf * * gdi * diff +example_005.pdf * * gdi * diff +example_006.pdf * * gdi * diff +example_007.pdf * * gdi * diff +example_008.pdf * * gdi * diff +example_009.pdf * * gdi * diff +example_010.pdf * * gdi * diff +example_011.pdf * * gdi * diff +example_013.pdf * * gdi * diff +example_015.pdf * * gdi * diff +example_016.pdf * * gdi * diff +example_017.pdf * * gdi * diff +example_018.pdf * * gdi * diff +example_019.pdf * * gdi * diff +example_020.pdf * * gdi * diff +example_021.pdf * * gdi * diff +example_022.pdf * * gdi * diff +example_023.pdf * * gdi * diff +example_024.pdf * * gdi * diff +example_025.pdf * * gdi * diff +example_026.pdf * * gdi * diff +example_027.pdf * * gdi * diff +example_029.pdf * * gdi * diff +example_030.pdf * * gdi * diff +example_031.pdf * * gdi * diff +example_032.pdf * * gdi * diff +example_033.pdf * * gdi * diff +example_034.pdf * * gdi * diff +example_035.pdf * * gdi * diff +example_036.pdf * * gdi * diff +example_037.pdf * * gdi * diff +example_038.pdf * * gdi * diff +example_039.pdf * * gdi * diff +example_040.pdf * * gdi * diff +example_041.pdf * * gdi * diff +example_042.pdf * * gdi * diff +example_043.pdf * * gdi * diff +example_044.pdf * * gdi * diff +example_045.pdf * * gdi * diff +example_046.pdf * * gdi * diff +example_047.pdf * * gdi * diff +example_048.pdf * * gdi * diff +example_049.pdf * * gdi * diff +example_050.pdf * * gdi * diff +example_051.pdf * * gdi * diff +example_052.pdf * * gdi * diff +example_053.pdf * * gdi * diff +example_055.pdf * * gdi * diff +example_056.pdf * * gdi * diff +example_057.pdf * * gdi * diff +example_058.pdf * * gdi * diff +example_059.pdf * * gdi * diff +example_060.pdf * * gdi * diff +example_061.pdf * * gdi * diff +example_062.pdf * * gdi * diff +example_063.pdf * * gdi * diff +example_064.pdf * * gdi * diff +example_065.pdf * * gdi * diff +image_8bit_devicergb_dctdecode.pdf * * gdi * diff +image_8bit_devicergb_dctdecode.pdf * * * * fuzzy +image_8bit_devicergb_dctdecode.pdf mac * skia * fuzzy +image_bmp.pdf * * gdi * diff +image_bmp.pdf * * * * fuzzy +image_bmp.pdf mac * skia * fuzzy +image_jpg.pdf * * gdi * diff +image_jpg.pdf * * * * fuzzy +image_jpg.pdf mac * skia * fuzzy +image_png.pdf * * gdi * diff +image_png.pdf mac * skia * fuzzy +image_tif.pdf * * gdi * diff +image_tif.pdf * * * * fuzzy=10,0.05,10.0 +mask_array.pdf * * gdi * diff +new_stamp2.pdf * * gdi * diff +quick_start_guide.pdf * * gdi * diff +whats_new_in_v3.0.pdf * * gdi * diff # TODO(crbug.com/42271067): Remove after associated bug is fixed -Date_FormCale.pdf * * * gdi * diff -Date_FormCale.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_3.5_P__3648_Password_1.pdf * * * gdi * diff -FRC_3.5_P__3648_Password_1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.1_Annotations_AP_N_R.D_.pdf * * * gdi * diff -FRC_8.4.1_Annotations_AP_N_R.D_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.1_Annotations_AS_Off_.pdf * * * gdi * diff -FRC_8.4.1_Annotations_AS_Off_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.1_Annotations_AS_Yes_.pdf * * * gdi * diff -FRC_8.4.1_Annotations_AS_Yes_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_Bl_Hide.pdf * * * gdi * diff -FRC_8.5_Bl_Hide.pdf * * * * fontations diff -FRC_8.5_E_GoTo_D.pdf * * * gdi * diff -FRC_8.5_E_GoTo_D.pdf * * * * fontations diff -FRC_8.5_Fo_URI_Base.pdf * * * gdi * diff -FRC_8.5_Fo_URI_Base.pdf * * * * fontations diff -FRC_8.5_U_GoToR_NewWindow.pdf * * * gdi * diff -FRC_8.5_U_GoToR_NewWindow.pdf * * * * fontations diff -FRC_8.5_U_GoToR_NewWindow_2.pdf * * * gdi * diff -FRC_8.5_U_GoToR_NewWindow_2.pdf * * * * fontations diff -FRC_8.5_Widget_C.pdf * * * gdi * diff -FRC_8.5_Widget_C.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_Widget_F.pdf * * * gdi * diff -FRC_8.5_Widget_K.pdf * * * gdi * diff -FRC_8.5_Widget_K.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_Widget_V.pdf * * * gdi * diff -FRC_8.5_Widget_V.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_X_GoToR_D.pdf * * * gdi * diff -FRC_8.5_X_GoToR_D.pdf * * * * fontations diff -Line_Stroke.pdf * * * gdi * diff -Line_Stroke.pdf * * * * fontations fuzzy=10,0.1,15 -Oneof1.pdf * * * gdi * diff -Oneof1.pdf * * * * fontations fuzzy=10,0.1,15 -Oneof2.pdf * * * gdi * diff -Oneof2.pdf * * * * fontations fuzzy=10,0.1,15 -PagePosition_any_rest.pdf * * * gdi * diff -PagePosition_any_rest.pdf * * * * fontations fuzzy=10,0.1,15 -PagePosition_first.pdf * * * gdi * diff -PagePosition_first.pdf * * * * fontations diff -PagePosition_last.pdf * * * gdi * diff -PagePosition_last.pdf * * * * fontations diff -PagePosition_no_any.pdf * * * gdi * diff -PagePosition_no_any.pdf * * * * fontations fuzzy=10,0.1,15 -PagePosition_rest.pdf * * * gdi * diff -PagePosition_rest.pdf * * * * fontations fuzzy=10,0.1,15 -PagePosition_rest_any.pdf * * * gdi * diff -PagePosition_rest_any.pdf * * * * fontations fuzzy=10,0.1,15 -Test_DateField_locale_en_CA.pdf * * * gdi * diff -Test_DateField_locale_en_CA.pdf * * * * fontations fuzzy=10,0.1,15 -Test_DateField_locale_en_GB.pdf * * * gdi * diff -Test_DateField_locale_en_GB.pdf * * * * fontations fuzzy=10,0.1,15 -Test_DateField_locale_en_US.pdf * * * gdi * diff -Test_DateField_locale_en_US.pdf * * * * fontations fuzzy=10,0.1,15 -Test_DateField_locale_fr_CA.pdf * * * gdi * diff -Test_DateField_locale_fr_CA.pdf * * * * fontations fuzzy=10,0.1,15 -Test_DateField_locale_fr_FR.pdf * * * gdi * diff -Test_DateField_locale_fr_FR.pdf * * * * fontations fuzzy=10,0.1,15 -Test_DateField_locale_nl_NL.pdf * * * gdi * diff -Test_DateField_locale_nl_NL.pdf * * * * fontations fuzzy=10,0.1,15 -Test_DateField_locale_zh_CN.pdf * * * gdi * diff -Test_DateField_locale_zh_CN.pdf * * * * fontations fuzzy=10,0.1,15 -Test_DateField_locale_zh_HK.pdf * * * gdi * diff -Test_Drop_downList.pdf * * * gdi * diff -Test_Drop_downList.pdf * * * * fontations fuzzy=10,0.1,15 -Test_NumericField.pdf * * * gdi * diff -Test_NumericField.pdf * * * * fontations fuzzy=10,0.1,15 -Test_PasswordField.pdf * * * gdi * diff -Test_PasswordField.pdf * * * * fontations fuzzy=10,0.1,15 -Test_RadioButton.pdf * * * gdi * diff -Test_RadioButton.pdf * * * * fontations fuzzy=10,0.1,15 -Test_ResetButton.pdf * * * gdi * diff -Test_ResetButton.pdf * * * * fontations fuzzy=10,0.1,15 -Test_TextField.pdf * * * gdi * diff -Test_TextField.pdf * * * * fontations fuzzy=10,0.1,15 -TimeField.pdf * * * gdi * diff -TimeField.pdf * * * * fontations fuzzy=10,0.1,15 -action_execute_a_menu_item.pdf * * * gdi * diff -action_hide_show_form.pdf * * * gdi * diff -action_on_focus.pdf * * * gdi * diff -action_reset.pdf * * * gdi * diff -action_run_javascript.pdf * * * gdi * diff -action_submit_a_form.pdf * * * gdi * diff -all_trigger_browsefordoc.pdf * * * gdi * diff -all_trigger_browsefordoc.pdf * * * * fontations diff -all_trigger_browsefordoc.pdf * * * * * fuzzy -all_trigger_browsefordoc.pdf mac * * skia * fuzzy -all_trigger_newdoc.pdf * * * gdi * diff -all_trigger_newdoc.pdf * * * * fontations fuzzy=10,0.1,15 -all_trigger_newdoc.pdf mac * * skia * fuzzy -all_trigger_run_js_lunchurl.pdf * * * gdi * diff -all_trigger_run_js_maildoc.pdf * * * gdi * diff -annotation_highlight_author_content.pdf * * * gdi * diff -annotation_highlight_long_content.pdf * * * gdi * diff -annotation_highlight_no_author.pdf * * * gdi * diff -app_launchurl.pdf * * * gdi * diff -bi.pdf * * * gdi * diff -bi.pdf mac * * skia * fuzzy -bug_434.pdf * * * gdi * diff -bug_434.pdf * * * * fontations diff -bug_440132.pdf * * * gdi * diff -calculate_average.pdf * * * gdi * diff -calculate_sum_a_b_c.pdf * * * gdi * diff -calculate_validate.pdf * * * gdi * diff -check_box_no_color.pdf * * * gdi * diff -combo_box_format.pdf * * * gdi * diff -date.pdf * * * gdi * diff -event.change.pdf * * * gdi * diff -event.changeex.pdf * * * gdi * diff -event.keydown.pdf * * * gdi * diff -event.keydown_1_.pdf * * * gdi * diff -event.shift.pdf * * * gdi * diff -event.type_name.pdf * * * gdi * diff -event.value.pdf * * * gdi * diff -event_change.pdf * * * gdi * diff -event_fieldfull.pdf * * * gdi * diff -event_fieldfull_1_.pdf * * * gdi * diff -example_014.pdf * * * gdi * diff -example_054.pdf * * * gdi * diff -form_button0.pdf * * * gdi * diff -form_button0.pdf mac * * skia * fuzzy -form_button1.pdf * * * gdi * diff -form_button1.pdf mac * * skia * fuzzy -form_button10.pdf * * * gdi * diff -form_button10.pdf mac * * skia * fuzzy -form_button2.pdf * * * gdi * diff -form_button2.pdf mac * * skia * fuzzy -form_button3.pdf * * * gdi * diff -form_button3.pdf mac * * skia * fuzzy -form_button4.pdf * * * gdi * diff -form_button4.pdf mac * * skia * fuzzy -form_button5.pdf * * * gdi * diff -form_button5.pdf mac * * skia * fuzzy -form_button7.pdf * * * gdi * diff -form_button7.pdf mac * * skia * fuzzy -form_button8.pdf * * * gdi * diff -form_button8.pdf mac * * skia * fuzzy -form_button9.pdf * * * gdi * diff -form_button9.pdf mac * * skia * fuzzy -form_checkbox.pdf * * * gdi * diff -form_checkbox1.pdf * * * gdi * diff -form_checkbox2.pdf * * * gdi * diff -form_checkbox3.pdf * * * gdi * diff -form_combobox_date.pdf * * * gdi * diff -form_combobox_date2.pdf * * * gdi * diff -form_combobox_num.pdf * * * gdi * diff -form_combobox_per.pdf * * * gdi * diff -form_combobox_plus.pdf * * * gdi * diff -form_combobox_product.pdf * * * gdi * diff -form_combobox_time.pdf * * * gdi * diff -form_radio.pdf * * * gdi * diff -form_same.pdf * * * gdi * diff -form_textfield_focused_ltr.in * * * gdi * diff -form_textfield_focused_ltr.in * * * * fontations fuzzy=10,0.1,15 -form_textfield_focused_rtl.in * * * gdi * diff -form_textfield_focused_rtl.in * * * * fontations fuzzy=10,0.1,15 -form_textfield_selected_ltr.in * * * gdi * diff -form_textfield_selected_rtl.in * * * gdi * diff -format_alert_box.pdf * * * gdi * diff -format_combo_box.pdf * * * gdi * diff -format_custom_format.pdf * * * gdi * diff -format_date.pdf * * * gdi * diff -format_number.pdf * * * gdi * diff -format_percentage.pdf * * * gdi * diff -format_special.pdf * * * gdi * diff -format_text_color.pdf * * * gdi * diff -getarray.pdf * * * gdi * diff -js_value_chack_box.pdf * * * gdi * diff -negative.pdf * * * gdi * diff -new_certify1.pdf * * * gdi * diff -new_signature1.pdf * * * gdi * diff -new_signature2.pdf * * * gdi * diff -none.pdf * * * gdi * diff -open_a_weblink.pdf * * * gdi * diff -percentage.pdf * * * gdi * diff -rotate.pdf * * * gdi * diff -show_1.pdf * * * gdi * diff -simplified_field_notation.pdf * * * gdi * diff -special.pdf * * * gdi * diff -submit_form.pdf * * * gdi * diff -text_field_font_input_decimal_point.pdf * * * gdi * diff -text_field_multiline_line_spacing.pdf * * * gdi * diff -time.pdf * * * gdi * diff -validate_alert_box.pdf * * * gdi * diff -widget_javascript.pdf * * * gdi * diff +Date_FormCale.pdf * * gdi * diff +Date_FormCale.pdf * * * fontations fuzzy=10,0.1,15 +FRC_3.5_P__3648_Password_1.pdf * * gdi * diff +FRC_3.5_P__3648_Password_1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.1_Annotations_AP_N_R.D_.pdf * * gdi * diff +FRC_8.4.1_Annotations_AP_N_R.D_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.1_Annotations_AS_Off_.pdf * * gdi * diff +FRC_8.4.1_Annotations_AS_Off_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.1_Annotations_AS_Yes_.pdf * * gdi * diff +FRC_8.4.1_Annotations_AS_Yes_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_Bl_Hide.pdf * * gdi * diff +FRC_8.5_Bl_Hide.pdf * * * fontations diff +FRC_8.5_E_GoTo_D.pdf * * gdi * diff +FRC_8.5_E_GoTo_D.pdf * * * fontations diff +FRC_8.5_Fo_URI_Base.pdf * * gdi * diff +FRC_8.5_Fo_URI_Base.pdf * * * fontations diff +FRC_8.5_U_GoToR_NewWindow.pdf * * gdi * diff +FRC_8.5_U_GoToR_NewWindow.pdf * * * fontations diff +FRC_8.5_U_GoToR_NewWindow_2.pdf * * gdi * diff +FRC_8.5_U_GoToR_NewWindow_2.pdf * * * fontations diff +FRC_8.5_Widget_C.pdf * * gdi * diff +FRC_8.5_Widget_C.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_Widget_F.pdf * * gdi * diff +FRC_8.5_Widget_K.pdf * * gdi * diff +FRC_8.5_Widget_K.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_Widget_V.pdf * * gdi * diff +FRC_8.5_Widget_V.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_X_GoToR_D.pdf * * gdi * diff +FRC_8.5_X_GoToR_D.pdf * * * fontations diff +Line_Stroke.pdf * * gdi * diff +Line_Stroke.pdf * * * fontations fuzzy=10,0.1,15 +Oneof1.pdf * * gdi * diff +Oneof1.pdf * * * fontations fuzzy=10,0.1,15 +Oneof2.pdf * * gdi * diff +Oneof2.pdf * * * fontations fuzzy=10,0.1,15 +PagePosition_any_rest.pdf * * gdi * diff +PagePosition_any_rest.pdf * * * fontations fuzzy=10,0.1,15 +PagePosition_first.pdf * * gdi * diff +PagePosition_first.pdf * * * fontations diff +PagePosition_last.pdf * * gdi * diff +PagePosition_last.pdf * * * fontations diff +PagePosition_no_any.pdf * * gdi * diff +PagePosition_no_any.pdf * * * fontations fuzzy=10,0.1,15 +PagePosition_rest.pdf * * gdi * diff +PagePosition_rest.pdf * * * fontations fuzzy=10,0.1,15 +PagePosition_rest_any.pdf * * gdi * diff +PagePosition_rest_any.pdf * * * fontations fuzzy=10,0.1,15 +Test_DateField_locale_en_CA.pdf * * gdi * diff +Test_DateField_locale_en_CA.pdf * * * fontations fuzzy=10,0.1,15 +Test_DateField_locale_en_GB.pdf * * gdi * diff +Test_DateField_locale_en_GB.pdf * * * fontations fuzzy=10,0.1,15 +Test_DateField_locale_en_US.pdf * * gdi * diff +Test_DateField_locale_en_US.pdf * * * fontations fuzzy=10,0.1,15 +Test_DateField_locale_fr_CA.pdf * * gdi * diff +Test_DateField_locale_fr_CA.pdf * * * fontations fuzzy=10,0.1,15 +Test_DateField_locale_fr_FR.pdf * * gdi * diff +Test_DateField_locale_fr_FR.pdf * * * fontations fuzzy=10,0.1,15 +Test_DateField_locale_nl_NL.pdf * * gdi * diff +Test_DateField_locale_nl_NL.pdf * * * fontations fuzzy=10,0.1,15 +Test_DateField_locale_zh_CN.pdf * * gdi * diff +Test_DateField_locale_zh_CN.pdf * * * fontations fuzzy=10,0.1,15 +Test_DateField_locale_zh_HK.pdf * * gdi * diff +Test_Drop_downList.pdf * * gdi * diff +Test_Drop_downList.pdf * * * fontations fuzzy=10,0.1,15 +Test_NumericField.pdf * * gdi * diff +Test_NumericField.pdf * * * fontations fuzzy=10,0.1,15 +Test_PasswordField.pdf * * gdi * diff +Test_PasswordField.pdf * * * fontations fuzzy=10,0.1,15 +Test_RadioButton.pdf * * gdi * diff +Test_RadioButton.pdf * * * fontations fuzzy=10,0.1,15 +Test_ResetButton.pdf * * gdi * diff +Test_ResetButton.pdf * * * fontations fuzzy=10,0.1,15 +Test_TextField.pdf * * gdi * diff +Test_TextField.pdf * * * fontations fuzzy=10,0.1,15 +TimeField.pdf * * gdi * diff +TimeField.pdf * * * fontations fuzzy=10,0.1,15 +action_execute_a_menu_item.pdf * * gdi * diff +action_hide_show_form.pdf * * gdi * diff +action_on_focus.pdf * * gdi * diff +action_reset.pdf * * gdi * diff +action_run_javascript.pdf * * gdi * diff +action_submit_a_form.pdf * * gdi * diff +all_trigger_browsefordoc.pdf * * gdi * diff +all_trigger_browsefordoc.pdf * * * fontations diff +all_trigger_browsefordoc.pdf * * * * fuzzy +all_trigger_browsefordoc.pdf mac * skia * fuzzy +all_trigger_newdoc.pdf * * gdi * diff +all_trigger_newdoc.pdf * * * fontations fuzzy=10,0.1,15 +all_trigger_newdoc.pdf mac * skia * fuzzy +all_trigger_run_js_lunchurl.pdf * * gdi * diff +all_trigger_run_js_maildoc.pdf * * gdi * diff +annotation_highlight_author_content.pdf * * gdi * diff +annotation_highlight_long_content.pdf * * gdi * diff +annotation_highlight_no_author.pdf * * gdi * diff +app_launchurl.pdf * * gdi * diff +bi.pdf * * gdi * diff +bi.pdf mac * skia * fuzzy +bug_434.pdf * * gdi * diff +bug_434.pdf * * * fontations diff +bug_440132.pdf * * gdi * diff +calculate_average.pdf * * gdi * diff +calculate_sum_a_b_c.pdf * * gdi * diff +calculate_validate.pdf * * gdi * diff +check_box_no_color.pdf * * gdi * diff +combo_box_format.pdf * * gdi * diff +date.pdf * * gdi * diff +event.change.pdf * * gdi * diff +event.changeex.pdf * * gdi * diff +event.keydown.pdf * * gdi * diff +event.keydown_1_.pdf * * gdi * diff +event.shift.pdf * * gdi * diff +event.type_name.pdf * * gdi * diff +event.value.pdf * * gdi * diff +event_change.pdf * * gdi * diff +event_fieldfull.pdf * * gdi * diff +event_fieldfull_1_.pdf * * gdi * diff +example_014.pdf * * gdi * diff +example_054.pdf * * gdi * diff +form_button0.pdf * * gdi * diff +form_button0.pdf mac * skia * fuzzy +form_button1.pdf * * gdi * diff +form_button1.pdf mac * skia * fuzzy +form_button10.pdf * * gdi * diff +form_button10.pdf mac * skia * fuzzy +form_button2.pdf * * gdi * diff +form_button2.pdf mac * skia * fuzzy +form_button3.pdf * * gdi * diff +form_button3.pdf mac * skia * fuzzy +form_button4.pdf * * gdi * diff +form_button4.pdf mac * skia * fuzzy +form_button5.pdf * * gdi * diff +form_button5.pdf mac * skia * fuzzy +form_button7.pdf * * gdi * diff +form_button7.pdf mac * skia * fuzzy +form_button8.pdf * * gdi * diff +form_button8.pdf mac * skia * fuzzy +form_button9.pdf * * gdi * diff +form_button9.pdf mac * skia * fuzzy +form_checkbox.pdf * * gdi * diff +form_checkbox1.pdf * * gdi * diff +form_checkbox2.pdf * * gdi * diff +form_checkbox3.pdf * * gdi * diff +form_combobox_date.pdf * * gdi * diff +form_combobox_date2.pdf * * gdi * diff +form_combobox_num.pdf * * gdi * diff +form_combobox_per.pdf * * gdi * diff +form_combobox_plus.pdf * * gdi * diff +form_combobox_product.pdf * * gdi * diff +form_combobox_time.pdf * * gdi * diff +form_radio.pdf * * gdi * diff +form_same.pdf * * gdi * diff +form_textfield_focused_ltr.in * * gdi * diff +form_textfield_focused_ltr.in * * * fontations fuzzy=10,0.1,15 +form_textfield_focused_rtl.in * * gdi * diff +form_textfield_focused_rtl.in * * * fontations fuzzy=10,0.1,15 +form_textfield_selected_ltr.in * * gdi * diff +form_textfield_selected_rtl.in * * gdi * diff +format_alert_box.pdf * * gdi * diff +format_combo_box.pdf * * gdi * diff +format_custom_format.pdf * * gdi * diff +format_date.pdf * * gdi * diff +format_number.pdf * * gdi * diff +format_percentage.pdf * * gdi * diff +format_special.pdf * * gdi * diff +format_text_color.pdf * * gdi * diff +getarray.pdf * * gdi * diff +js_value_chack_box.pdf * * gdi * diff +negative.pdf * * gdi * diff +new_certify1.pdf * * gdi * diff +new_signature1.pdf * * gdi * diff +new_signature2.pdf * * gdi * diff +none.pdf * * gdi * diff +open_a_weblink.pdf * * gdi * diff +percentage.pdf * * gdi * diff +rotate.pdf * * gdi * diff +show_1.pdf * * gdi * diff +simplified_field_notation.pdf * * gdi * diff +special.pdf * * gdi * diff +submit_form.pdf * * gdi * diff +text_field_font_input_decimal_point.pdf * * gdi * diff +text_field_multiline_line_spacing.pdf * * gdi * diff +time.pdf * * gdi * diff +validate_alert_box.pdf * * gdi * diff +widget_javascript.pdf * * gdi * diff # TODO(crbug.com/42271068): Remove after associated bug is fixed -1_10_watermark.pdf * * * gdi_skia * diff -1_10_watermark.pdf * * * * fontations fuzzy=10,0.1,15 -1_10_watermark.pdf * * * skia * fuzzy -1_matrix.pdf * * * gdi * diff -2_color_tiling.pdf * * * gdi * diff -2_shading_type_6_00.pdf * * * gdi_skia * diff -2_shading_type_6_001.pdf * * * gdi_skia * diff -2_uncolor_tiling.pdf * * * gdi * diff -FRC_11_8.2.4_View_edit.pdf * * * gdi * diff -FRC_11_8.2.4_View_edit.pdf * * * * fontations diff -FRC_11_8.2.4_View_edit.pdf * * * * * fuzzy -FRC_11_8.2.4_View_edit.pdf mac * * skia * fuzzy -FRC_12_8.2.4_View_remove_all.pdf * * * gdi * diff -FRC_12_8.2.4_View_remove_all.pdf * * * * fontations diff -FRC_12_8.2.4_View_remove_all.pdf * * * * * fuzzy -FRC_12_8.2.4_View_remove_all.pdf mac * * skia * fuzzy -FRC_13_8.2.4_View_remove_value.pdf * * * gdi * diff -FRC_13_8.2.4_View_remove_value.pdf * * * * fontations diff -FRC_13_8.2.4_View_remove_value.pdf * * * * * fuzzy -FRC_13_8.2.4_View_remove_value.pdf mac * * skia * fuzzy -FRC_14_8.2.4_Sort_remove_all.pdf * * * gdi * diff -FRC_14_8.2.4_Sort_remove_all.pdf * * * * fontations diff -FRC_14_8.2.4_Sort_remove_all.pdf * * * * * fuzzy -FRC_14_8.2.4_Sort_remove_all.pdf mac * * skia * fuzzy -FRC_15_8.2.4_Sort_remove_value.pdf * * * gdi * diff -FRC_15_8.2.4_Sort_remove_value.pdf * * * * fontations diff -FRC_15_8.2.4_Sort_remove_value.pdf * * * * * fuzzy -FRC_15_8.2.4_Sort_remove_value.pdf mac * * skia * fuzzy -FRC_1_8.2.4_Type_8.6_.pdf * * * gdi * diff -FRC_1_8.2.4_Type_8.6_.pdf * * * * fontations diff -FRC_1_8.2.4_Type_8.6_.pdf * * * * * fuzzy -FRC_1_8.2.4_Type_8.6_.pdf mac * * skia * fuzzy -FRC_2_8.2.4_Type_8.6__remove_value.pdf * * * gdi * diff -FRC_2_8.2.4_Type_8.6__remove_value.pdf * * * * fontations diff -FRC_2_8.2.4_Type_8.6__remove_value.pdf * * * * * fuzzy -FRC_2_8.2.4_Type_8.6__remove_value.pdf mac * * skia * fuzzy -FRC_3.5_AuthEvent_EFOpen.pdf * * * gdi * diff -FRC_3.5_AuthEvent_EFOpen.pdf * * * * fontations diff -FRC_3.5_AuthEvent_EFOpen.pdf mac * * skia * fuzzy -FRC_3.5_CFM_AESV2__EncryptMetadata_F.pdf * * * gdi * diff -FRC_3.5_CFM_AESV2__EncryptMetadata_F.pdf * * * * fontations diff -FRC_3.5_CFM_AESV2__EncryptMetadata_F.pdf mac * * skia * fuzzy -FRC_3.5_CF_EFF_StdCF_Strf_Stmf_Identity.pdf * * * gdi * diff -FRC_3.5_CF_EFF_StdCF_Strf_Stmf_Identity.pdf * * * * fontations diff -FRC_3.5_CF_EFF_StdCF_Strf_Stmf_Identity.pdf mac * * skia * fuzzy -FRC_3.5_CF_Strf_stmf_StdCF.pdf * * * gdi * diff -FRC_3.5_CF_Strf_stmf_StdCF.pdf * * * * fontations diff -FRC_3.5_CF_Strf_stmf_StdCF.pdf mac * * skia * fuzzy -FRC_3.5_EncryptMetadata_None.pdf * * * gdi * diff -FRC_3.5_EncryptMetadata_None.pdf * * * * fontations diff -FRC_3.5_EncryptMetadata_None.pdf mac * * skia * fuzzy -FRC_3.5_V_4_CFM_V2_.pdf * * * gdi * diff -FRC_3.5_V_4_CFM_V2_.pdf * * * * fontations diff -FRC_3.5_V_4_CFM_V2_.pdf mac * * skia * fuzzy -FRC_3.5_V_5_CFM_AESV3.pdf * * * gdi * diff -FRC_3.5_V_5_CFM_AESV3.pdf * * * * fontations diff -FRC_3.5_V_5_CFM_AESV3.pdf mac * * skia * fuzzy -FRC_3.5_v_1_length_40_Filter_standard.pdf * * * gdi * diff -FRC_3.5_v_1_length_40_Filter_standard.pdf * * * * fontations diff -FRC_3.5_v_1_length_40_Filter_standard.pdf mac * * skia * fuzzy -FRC_3.5_v_2_length_128_AuthEvent_DocOpen_.pdf * * * gdi * diff -FRC_3.5_v_2_length_128_AuthEvent_DocOpen_.pdf * * * * fontations diff -FRC_3.5_v_2_length_128_AuthEvent_DocOpen_.pdf mac * * skia * fuzzy -FRC_3_8.2.4_Type_8.6__edit_.pdf * * * gdi * diff -FRC_3_8.2.4_Type_8.6__edit_.pdf * * * * fontations diff -FRC_3_8.2.4_Type_8.6__edit_.pdf * * * * * fuzzy -FRC_3_8.2.4_Type_8.6__edit_.pdf mac * * skia * fuzzy -FRC_4.5.5_Pattern_shading.pdf * * * gdi * diff -FRC_4.5.5_Pattern_shading.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.5_Pattern_shading.pdf mac * * skia * fuzzy -FRC_4.5.5_Pattern_tiling.pdf * * * gdi_skia * diff -FRC_4.5.5_Pattern_tiling.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4_8.2.4_Schema_8.6__remove_all.pdf * * * gdi * diff -FRC_4_8.2.4_Schema_8.6__remove_all.pdf * * * * fontations diff -FRC_4_8.2.4_Schema_8.6__remove_all.pdf * * * * * fuzzy -FRC_4_8.2.4_Schema_8.6__remove_all.pdf mac * * skia * fuzzy -FRC_5_8.2.4_Schema_8.6__remove_value.pdf * * * gdi * diff -FRC_5_8.2.4_Schema_8.6__remove_value.pdf * * * * fontations diff -FRC_5_8.2.4_Schema_8.6__remove_value.pdf * * * * * fuzzy -FRC_5_8.2.4_Schema_8.6__remove_value.pdf mac * * skia * fuzzy -FRC_6_8.2.4_Schema_8.6__remove_obj.pdf * * * gdi * diff -FRC_6_8.2.4_Schema_8.6__remove_obj.pdf * * * * fontations diff -FRC_6_8.2.4_Schema_8.6__remove_obj.pdf * * * * * fuzzy -FRC_6_8.2.4_Schema_8.6__remove_obj.pdf mac * * skia * fuzzy -FRC_7_8.2.4_View_H.pdf * * * gdi * diff -FRC_7_8.2.4_View_H.pdf * * * * fontations diff -FRC_7_8.2.4_View_H.pdf * * * * * fuzzy -FRC_7_8.2.4_View_H.pdf mac * * skia * fuzzy -FRC_8_8.2.4_View_D.pdf * * * gdi * diff -FRC_8_8.2.4_View_D.pdf * * * * fontations diff -FRC_8_8.2.4_View_D.pdf * * * * * fuzzy -FRC_8_8.2.4_View_D.pdf mac * * skia * fuzzy -FRC_9_8.2.4_View_T.pdf * * * gdi * diff -FRC_9_8.2.4_View_T.pdf * * * * fontations diff -FRC_9_8.2.4_View_T.pdf * * * * * fuzzy -FRC_9_8.2.4_View_T.pdf mac * * skia * fuzzy -annotation_circle_fill_opacity.pdf * * * gdi_skia * diff -annotation_circle_fill_opacity.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_circle_fill_opacity.pdf mac * * skia * fuzzy -annotation_square_fill_opacity.pdf * * * gdi_skia * diff -annotation_square_fill_opacity.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_square_fill_opacity.pdf mac * * skia * fuzzy -annotation_square_fill_opacity_dash.pdf * * * gdi_skia * diff -annotation_square_fill_opacity_dash.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_square_fill_opacity_dash.pdf mac * * skia * fuzzy -bug_0_length_line.pdf * * * gdi * diff -bug_883026.pdf * * * gdi_skia * diff -bug_883026.pdf * * * * fontations fuzzy=10,0.1,15 -clipping_text.pdf * * * gdi * diff -clipping_text.pdf * * * * fontations fuzzy=10,0.1,15 -en_fqa.pdf * * * gdi_skia * diff -en_introduce.pdf * * * gdi_skia * diff -en_system.pdf * * * gdi * diff -en_system.pdf mac * * skia * fuzzy -example_012.pdf * * * gdi * diff -gradient_many_stops.pdf * * * gdi * diff -group_xobject.pdf * * * gdi * diff -group_xobject.pdf * * * * fontations fuzzy=10,0.1,15 -image_gif.pdf * * * gdi_skia * diff -image_gif.pdf mac * * skia * fuzzy -image_ico.pdf * * * gdi_skia * diff -new_pdfsign1.pdf * * * gdi_skia * diff -new_pdfsign2.pdf * * * gdi_skia * diff -new_pdfsign3.pdf * * * gdi_skia * diff -new_pdfsign3.pdf * * * * * fuzzy -new_pdfsign4.pdf * * * gdi_skia * diff -new_stamp3.pdf * * * gdi_skia * diff -new_stamp3.pdf * * * * * fuzzy -new_stamp3.pdf mac * * skia * fuzzy -path_10_jd.pdf * * * gdi * diff -path_5_pattern.pdf * * * gdi * diff -path_7.pdf * * * gdi * diff -path_9.pdf * * * gdi * diff -transformation.pdf * * * gdi * diff -transparent1.pdf * * * gdi_skia * diff -xfermodes.pdf * * * gdi_skia * diff -xfermodes2.pdf * * * gdi * diff -xfermodes3.pdf * * * gdi_skia * diff +1_10_watermark.pdf * * gdi_skia * diff +1_10_watermark.pdf * * * fontations fuzzy=10,0.1,15 +1_10_watermark.pdf * * skia * fuzzy +1_matrix.pdf * * gdi * diff +2_color_tiling.pdf * * gdi * diff +2_shading_type_6_00.pdf * * gdi_skia * diff +2_shading_type_6_001.pdf * * gdi_skia * diff +2_uncolor_tiling.pdf * * gdi * diff +FRC_11_8.2.4_View_edit.pdf * * gdi * diff +FRC_11_8.2.4_View_edit.pdf * * * fontations diff +FRC_11_8.2.4_View_edit.pdf * * * * fuzzy +FRC_11_8.2.4_View_edit.pdf mac * skia * fuzzy +FRC_12_8.2.4_View_remove_all.pdf * * gdi * diff +FRC_12_8.2.4_View_remove_all.pdf * * * fontations diff +FRC_12_8.2.4_View_remove_all.pdf * * * * fuzzy +FRC_12_8.2.4_View_remove_all.pdf mac * skia * fuzzy +FRC_13_8.2.4_View_remove_value.pdf * * gdi * diff +FRC_13_8.2.4_View_remove_value.pdf * * * fontations diff +FRC_13_8.2.4_View_remove_value.pdf * * * * fuzzy +FRC_13_8.2.4_View_remove_value.pdf mac * skia * fuzzy +FRC_14_8.2.4_Sort_remove_all.pdf * * gdi * diff +FRC_14_8.2.4_Sort_remove_all.pdf * * * fontations diff +FRC_14_8.2.4_Sort_remove_all.pdf * * * * fuzzy +FRC_14_8.2.4_Sort_remove_all.pdf mac * skia * fuzzy +FRC_15_8.2.4_Sort_remove_value.pdf * * gdi * diff +FRC_15_8.2.4_Sort_remove_value.pdf * * * fontations diff +FRC_15_8.2.4_Sort_remove_value.pdf * * * * fuzzy +FRC_15_8.2.4_Sort_remove_value.pdf mac * skia * fuzzy +FRC_1_8.2.4_Type_8.6_.pdf * * gdi * diff +FRC_1_8.2.4_Type_8.6_.pdf * * * fontations diff +FRC_1_8.2.4_Type_8.6_.pdf * * * * fuzzy +FRC_1_8.2.4_Type_8.6_.pdf mac * skia * fuzzy +FRC_2_8.2.4_Type_8.6__remove_value.pdf * * gdi * diff +FRC_2_8.2.4_Type_8.6__remove_value.pdf * * * fontations diff +FRC_2_8.2.4_Type_8.6__remove_value.pdf * * * * fuzzy +FRC_2_8.2.4_Type_8.6__remove_value.pdf mac * skia * fuzzy +FRC_3.5_AuthEvent_EFOpen.pdf * * gdi * diff +FRC_3.5_AuthEvent_EFOpen.pdf * * * fontations diff +FRC_3.5_AuthEvent_EFOpen.pdf mac * skia * fuzzy +FRC_3.5_CFM_AESV2__EncryptMetadata_F.pdf * * gdi * diff +FRC_3.5_CFM_AESV2__EncryptMetadata_F.pdf * * * fontations diff +FRC_3.5_CFM_AESV2__EncryptMetadata_F.pdf mac * skia * fuzzy +FRC_3.5_CF_EFF_StdCF_Strf_Stmf_Identity.pdf * * gdi * diff +FRC_3.5_CF_EFF_StdCF_Strf_Stmf_Identity.pdf * * * fontations diff +FRC_3.5_CF_EFF_StdCF_Strf_Stmf_Identity.pdf mac * skia * fuzzy +FRC_3.5_CF_Strf_stmf_StdCF.pdf * * gdi * diff +FRC_3.5_CF_Strf_stmf_StdCF.pdf * * * fontations diff +FRC_3.5_CF_Strf_stmf_StdCF.pdf mac * skia * fuzzy +FRC_3.5_EncryptMetadata_None.pdf * * gdi * diff +FRC_3.5_EncryptMetadata_None.pdf * * * fontations diff +FRC_3.5_EncryptMetadata_None.pdf mac * skia * fuzzy +FRC_3.5_V_4_CFM_V2_.pdf * * gdi * diff +FRC_3.5_V_4_CFM_V2_.pdf * * * fontations diff +FRC_3.5_V_4_CFM_V2_.pdf mac * skia * fuzzy +FRC_3.5_V_5_CFM_AESV3.pdf * * gdi * diff +FRC_3.5_V_5_CFM_AESV3.pdf * * * fontations diff +FRC_3.5_V_5_CFM_AESV3.pdf mac * skia * fuzzy +FRC_3.5_v_1_length_40_Filter_standard.pdf * * gdi * diff +FRC_3.5_v_1_length_40_Filter_standard.pdf * * * fontations diff +FRC_3.5_v_1_length_40_Filter_standard.pdf mac * skia * fuzzy +FRC_3.5_v_2_length_128_AuthEvent_DocOpen_.pdf * * gdi * diff +FRC_3.5_v_2_length_128_AuthEvent_DocOpen_.pdf * * * fontations diff +FRC_3.5_v_2_length_128_AuthEvent_DocOpen_.pdf mac * skia * fuzzy +FRC_3_8.2.4_Type_8.6__edit_.pdf * * gdi * diff +FRC_3_8.2.4_Type_8.6__edit_.pdf * * * fontations diff +FRC_3_8.2.4_Type_8.6__edit_.pdf * * * * fuzzy +FRC_3_8.2.4_Type_8.6__edit_.pdf mac * skia * fuzzy +FRC_4.5.5_Pattern_shading.pdf * * gdi * diff +FRC_4.5.5_Pattern_shading.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.5_Pattern_shading.pdf mac * skia * fuzzy +FRC_4.5.5_Pattern_tiling.pdf * * gdi_skia * diff +FRC_4.5.5_Pattern_tiling.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4_8.2.4_Schema_8.6__remove_all.pdf * * gdi * diff +FRC_4_8.2.4_Schema_8.6__remove_all.pdf * * * fontations diff +FRC_4_8.2.4_Schema_8.6__remove_all.pdf * * * * fuzzy +FRC_4_8.2.4_Schema_8.6__remove_all.pdf mac * skia * fuzzy +FRC_5_8.2.4_Schema_8.6__remove_value.pdf * * gdi * diff +FRC_5_8.2.4_Schema_8.6__remove_value.pdf * * * fontations diff +FRC_5_8.2.4_Schema_8.6__remove_value.pdf * * * * fuzzy +FRC_5_8.2.4_Schema_8.6__remove_value.pdf mac * skia * fuzzy +FRC_6_8.2.4_Schema_8.6__remove_obj.pdf * * gdi * diff +FRC_6_8.2.4_Schema_8.6__remove_obj.pdf * * * fontations diff +FRC_6_8.2.4_Schema_8.6__remove_obj.pdf * * * * fuzzy +FRC_6_8.2.4_Schema_8.6__remove_obj.pdf mac * skia * fuzzy +FRC_7_8.2.4_View_H.pdf * * gdi * diff +FRC_7_8.2.4_View_H.pdf * * * fontations diff +FRC_7_8.2.4_View_H.pdf * * * * fuzzy +FRC_7_8.2.4_View_H.pdf mac * skia * fuzzy +FRC_8_8.2.4_View_D.pdf * * gdi * diff +FRC_8_8.2.4_View_D.pdf * * * fontations diff +FRC_8_8.2.4_View_D.pdf * * * * fuzzy +FRC_8_8.2.4_View_D.pdf mac * skia * fuzzy +FRC_9_8.2.4_View_T.pdf * * gdi * diff +FRC_9_8.2.4_View_T.pdf * * * fontations diff +FRC_9_8.2.4_View_T.pdf * * * * fuzzy +FRC_9_8.2.4_View_T.pdf mac * skia * fuzzy +annotation_circle_fill_opacity.pdf * * gdi_skia * diff +annotation_circle_fill_opacity.pdf * * * fontations fuzzy=10,0.1,15 +annotation_circle_fill_opacity.pdf mac * skia * fuzzy +annotation_square_fill_opacity.pdf * * gdi_skia * diff +annotation_square_fill_opacity.pdf * * * fontations fuzzy=10,0.1,15 +annotation_square_fill_opacity.pdf mac * skia * fuzzy +annotation_square_fill_opacity_dash.pdf * * gdi_skia * diff +annotation_square_fill_opacity_dash.pdf * * * fontations fuzzy=10,0.1,15 +annotation_square_fill_opacity_dash.pdf mac * skia * fuzzy +bug_0_length_line.pdf * * gdi * diff +bug_883026.pdf * * gdi_skia * diff +bug_883026.pdf * * * fontations fuzzy=10,0.1,15 +clipping_text.pdf * * gdi * diff +clipping_text.pdf * * * fontations fuzzy=10,0.1,15 +en_fqa.pdf * * gdi_skia * diff +en_introduce.pdf * * gdi_skia * diff +en_system.pdf * * gdi * diff +en_system.pdf mac * skia * fuzzy +example_012.pdf * * gdi * diff +gradient_many_stops.pdf * * gdi * diff +group_xobject.pdf * * gdi * diff +group_xobject.pdf * * * fontations fuzzy=10,0.1,15 +image_gif.pdf * * gdi_skia * diff +image_gif.pdf mac * skia * fuzzy +image_ico.pdf * * gdi_skia * diff +new_pdfsign1.pdf * * gdi_skia * diff +new_pdfsign2.pdf * * gdi_skia * diff +new_pdfsign3.pdf * * gdi_skia * diff +new_pdfsign3.pdf * * * * fuzzy +new_pdfsign4.pdf * * gdi_skia * diff +new_stamp3.pdf * * gdi_skia * diff +new_stamp3.pdf * * * * fuzzy +new_stamp3.pdf mac * skia * fuzzy +path_10_jd.pdf * * gdi * diff +path_5_pattern.pdf * * gdi * diff +path_7.pdf * * gdi * diff +path_9.pdf * * gdi * diff +transformation.pdf * * gdi * diff +transparent1.pdf * * gdi_skia * diff +xfermodes.pdf * * gdi_skia * diff +xfermodes2.pdf * * gdi * diff +xfermodes3.pdf * * gdi_skia * diff # # JavaScript tests # -bug_679642.in * * noxfa * * diff -bug_735912.in * * noxfa * * diff +bug_679642.in * nov8,v8 * * diff +bug_735912.in * nov8,v8 * * diff # xfa_specific # TODO(crbug.com/42270097): Remove after associated bug is fixed -resolve_nodes_1.pdf * * * * * diff +resolve_nodes_1.pdf * * * * diff # # Pixel tests # # TODO(crbug.com/475874968): Remove after the bug is fixed -alpha_composite.in * * * gdi * diff +alpha_composite.in * * gdi * diff # TODO(crbug.com/40643646): Remove after associated bug is fixed -bug_40643646.in * * * * * diff +bug_40643646.in * * * * diff # TODO(crbug.com/40721524): Remove after associated bug is fixed -bug_40721524.in * * * * * diff +bug_40721524.in * * * * diff # TODO(thestig): Remove after fixing inline image parsing. -bug_1236805.in * * * * * diff +bug_1236805.in * * * * diff # TODO(crbug.com/42270756): Remove after associated bug is fixed -bug_1258634.in * * * * * diff +bug_1258634.in * * * * diff # TODO(crbug.com/42270333): Remove after associated bug is fixed -bug_42270333.in * * * * * diff +bug_42270333.in * * * * diff # TODO(crbug.com/40860237): Remove after associated bug is fixed -bug_40860237.in mac * * agg * diff -bug_40860237.in * * * * fontations fuzzy=10,0.1,15 +bug_40860237.in mac * agg * diff +bug_40860237.in * * * fontations fuzzy=10,0.1,15 # This test is intentionally suppressed on Windows. Normally, Windows provides # the Symbol font, so this PDF would render correctly. However, in the hermetic # test environment, there is no Symbol font and the rendering is incorrect. -bug_1442723.in win * * * * diff -bug_1442723.in * * * * fontations fuzzy=10,0.1,15 +bug_1442723.in win * * * diff +bug_1442723.in * * * fontations fuzzy=10,0.1,15 # TODO(crbug.com/42270459): Remove after associated bug is fixed -bug_42270459_2.in * * * * * diff +bug_42270459_2.in * * * * diff # TODO(crbug.com/42270524): Remove after associated bug is fixed -bug_42270524.in * * * * * diff +bug_42270524.in * * * * diff # TODO(crbug.com/42270577): Remove after associated bug is fixed -bug_42270577.in * * * * * diff +bug_42270577.in * * * * diff # TODO(crbug.com/42270732): Remove after associated bug is fixed -bug_42270732.in * * * * * diff +bug_42270732.in * * * * diff # TODO(crbug.com/42270979): Remove after associated bug is fixed -bug_42270979_1.in * * * agg * diff -bug_42270979_2.in * * * agg * diff -bug_42270979_3.in * * * agg * diff +bug_42270979_1.in * * agg * diff +bug_42270979_2.in * * agg * diff +bug_42270979_3.in * * agg * diff # TODO(crbug.com/42270980): Remove after associated bug is fixed -bug_42270980.in * * * * * diff +bug_42270980.in * * * * diff # TODO(crbug.com/42271010): Remove after associated bug is fixed -bug_42271010.pdf * * * * * diff +bug_42271010.pdf * * * * diff # TODO(crbug.com/41010502): Remove after associated bug is fixed -bug_41010502_1.in * * * * * diff +bug_41010502_1.in * * * * diff # TODO(crbug.com/346766787): Remove after associated bug is fixed -bug_346766787.in * * * * * diff +bug_346766787.in * * * * diff # TODO(crbug.com/394767650): Remove after associated bug is fixed -bug_394767650.in * * * * * diff +bug_394767650.in * * * * diff # TODO(crbug.com/41153500): Remove after associated bug is fixed -bug_41153500.in * * * agg * diff +bug_41153500.in * * agg * diff # TODO(crbug.com/42271472): Remove after associated bug is fixed -bug_42271472.in * nov8 * * * diff +bug_42271472.in * nov8 * * diff # TODO(crbug.com/40040570, crbug.com/40040569): Remove after associated bug is # fixed -bug_40040570.in * * * skia * diff +bug_40040570.in * * skia * diff # TODO(crbug.com/41470360): Remove after associated bug is fixed -bug_41470360.in * * * agg * diff +bug_41470360.in * * agg * diff # TODO(crbug.com/42270756): Remove after associated bug is fixed -jpxdecode.in * * * * * diff -jpxdecode_without_bitspercomponent.in * * * * * diff -jpxdecode_without_colorspace.in * * * * * diff +jpxdecode.in * * * * diff +jpxdecode_without_bitspercomponent.in * * * * diff +jpxdecode_without_colorspace.in * * * * diff # TODO(crbug.com/40661120): Remove after associated bug is fixed -reset_button.in * * * * * diff +reset_button.in * * * * diff # TODO(crbug.com/479849565): Remove after associated bug is fixed -bug_479849565.in * * * agg * diff +bug_479849565.in * * agg * diff # xfa_specific # TODO(crbug.com/42270088): Remove after associated bug is fixed -bug_997412.in win * * * * diff +bug_997412.in win * * * diff # TODO(crbug.com/42270098): Remove after associated bug is fixed -standard_symbols.pdf * * * * * diff +standard_symbols.pdf * * * * diff # TODO(crbug.com/42270088): Remove after associated bug is fixed -xfa_example.in win * * * * diff +xfa_example.in win * * * diff # TODO(crbug.com/42270088): Remove after associated bug is fixed -xfa_textfield.in win * * * * diff -xfa_textfield.in mac * * skia * fuzzy +xfa_textfield.in win * * * diff +xfa_textfield.in mac * skia * fuzzy # GDI # TODO(crbug.com/42271066): Remove after associated bug is fixed -bug_1258968.in * * * gdi * diff -bug_1258968.in * * * skia * fuzzy -bug_1383708.in * * * gdi * diff -bug_1383708.in mac * * skia * fuzzy +bug_1258968.in * * gdi * diff +bug_1258968.in * * skia * fuzzy +bug_1383708.in * * gdi * diff +bug_1383708.in mac * skia * fuzzy # TODO(crbug.com/42271067): Remove after associated bug is fixed -barcode_test.pdf * * * gdi * diff -barcode_test.pdf * * * * fontations fuzzy=10,0.1,15 -bug_1026918.in * * * gdi * diff -bug_1072440.in * * * gdi * diff -bug_1072440.in * * * * fontations fuzzy=10,0.1,15 -bug_113910.in * * * gdi * diff -bug_1282.in * * * gdi * diff -bug_1286970.in * * * gdi * diff -bug_1304714.in * * * gdi * diff -bug_1337.in * * * gdi * diff -bug_1372651.in * * * gdi * diff -bug_1372651.in * * * * fontations fuzzy=10,0.1,15 -bug_477200528.in * * * gdi * diff -bug_477200528.in * * * * fontations fuzzy=10,0.1,15 -bug_725389.in * * * gdi * diff -bug_725389.in * * * * fontations fuzzy=10,0.1,15 -bug_733528.in * * * gdi * diff -bug_733528.in * * * * fontations fuzzy=10,0.1,15 -bug_736695_1.in * * * gdi * diff -bug_736695_2.in * * * gdi * diff -bug_736695_2.in * * * * fontations fuzzy=10,0.1,15 -bug_736695_3.in * * * gdi * diff -bug_736695_4.in * * * gdi * diff -bug_983137.in * * * gdi * diff -checkbox_radiobutton.in * * * gdi * diff -checkbox_radiobutton_hide.in * * * gdi * diff -checkbox_radiobutton_reset.in * * * gdi * diff -combobox_form.in * * * gdi * diff -dynamic_list_box_allow_multiple_selection.pdf * * * gdi * diff -dynamic_list_box_allow_multiple_selection.pdf * * * * fontations fuzzy=10,0.1,15 -dynamic_password_field_background_fill.pdf * * * gdi * diff -dynamic_password_field_background_fill.pdf mac * * skia * fuzzy -dynamic_password_field_background_fill.pdf * * * * fontations fuzzy=10,0.1,15 -dynamic_table_color_and_width.pdf * * * gdi * diff -dynamic_table_color_and_width.pdf * * * * fontations fuzzy=10,0.1,15 -password.in * * * gdi * diff -resolve_nodes_0.pdf * * * gdi * diff -resolve_nodes_0.pdf * * * * * fuzzy -resolve_nodes_0.pdf * * * * fontations fuzzy=10,0.1,15 -scrollable_widgets1.in * * * gdi * diff -scrollable_widgets2.in * * * gdi * diff -scrollable_widgets2.in * * * * fontations fuzzy=10,0.1,15 -static_list_box_caption.pdf * * * gdi * diff -static_list_box_caption.pdf * * * * fontations fuzzy=10,0.1,15 -static_password_field_rotate.pdf * * * gdi * diff -static_password_field_rotate.pdf * * * * fontations fuzzy=15,0.1,15 -text_form_custom_font.in * * * gdi * diff -text_form_multiline.in * * * gdi * diff -text_form_multiline.in * * * * fontations fuzzy=10,0.1,15 -xfa_bmp_image.in * * * gdi * diff -xfa_gif_image.in * * * gdi * diff -xfa_jpg_image.in * * * gdi * diff -xfa_node_caption.pdf * * * gdi * diff -xfa_node_caption.pdf * * * * fontations fuzzy=10,0.1,15 -xfa_node_caption.pdf mac * * skia * fuzzy -xfa_png_image.in * * * gdi * diff -xfa_rectangle_node.in * * * gdi * diff -xfa_tiff_image.in * * * gdi * diff -xfa_tiff_lzw_image.in * * * gdi * diff -xfa_tiff_packbits_image.in * * * gdi * diff +barcode_test.pdf * * gdi * diff +barcode_test.pdf * * * fontations fuzzy=10,0.1,15 +bug_1026918.in * * gdi * diff +bug_1072440.in * * gdi * diff +bug_1072440.in * * * fontations fuzzy=10,0.1,15 +bug_113910.in * * gdi * diff +bug_1282.in * * gdi * diff +bug_1286970.in * * gdi * diff +bug_1304714.in * * gdi * diff +bug_1337.in * * gdi * diff +bug_1372651.in * * gdi * diff +bug_1372651.in * * * fontations fuzzy=10,0.1,15 +bug_477200528.in * * gdi * diff +bug_477200528.in * * * fontations fuzzy=10,0.1,15 +bug_725389.in * * gdi * diff +bug_725389.in * * * fontations fuzzy=10,0.1,15 +bug_733528.in * * gdi * diff +bug_733528.in * * * fontations fuzzy=10,0.1,15 +bug_736695_1.in * * gdi * diff +bug_736695_2.in * * gdi * diff +bug_736695_2.in * * * fontations fuzzy=10,0.1,15 +bug_736695_3.in * * gdi * diff +bug_736695_4.in * * gdi * diff +bug_983137.in * * gdi * diff +checkbox_radiobutton.in * * gdi * diff +checkbox_radiobutton_hide.in * * gdi * diff +checkbox_radiobutton_reset.in * * gdi * diff +combobox_form.in * * gdi * diff +dynamic_list_box_allow_multiple_selection.pdf * * gdi * diff +dynamic_list_box_allow_multiple_selection.pdf * * * fontations fuzzy=10,0.1,15 +dynamic_password_field_background_fill.pdf * * gdi * diff +dynamic_password_field_background_fill.pdf mac * skia * fuzzy +dynamic_password_field_background_fill.pdf * * * fontations fuzzy=10,0.1,15 +dynamic_table_color_and_width.pdf * * gdi * diff +dynamic_table_color_and_width.pdf * * * fontations fuzzy=10,0.1,15 +password.in * * gdi * diff +resolve_nodes_0.pdf * * gdi * diff +resolve_nodes_0.pdf * * * * fuzzy +resolve_nodes_0.pdf * * * fontations fuzzy=10,0.1,15 +scrollable_widgets1.in * * gdi * diff +scrollable_widgets2.in * * gdi * diff +scrollable_widgets2.in * * * fontations fuzzy=10,0.1,15 +static_list_box_caption.pdf * * gdi * diff +static_list_box_caption.pdf * * * fontations fuzzy=10,0.1,15 +static_password_field_rotate.pdf * * gdi * diff +static_password_field_rotate.pdf * * * fontations fuzzy=15,0.1,15 +text_form_custom_font.in * * gdi * diff +text_form_multiline.in * * gdi * diff +text_form_multiline.in * * * fontations fuzzy=10,0.1,15 +xfa_bmp_image.in * * gdi * diff +xfa_gif_image.in * * gdi * diff +xfa_jpg_image.in * * gdi * diff +xfa_node_caption.pdf * * gdi * diff +xfa_node_caption.pdf * * * fontations fuzzy=10,0.1,15 +xfa_node_caption.pdf mac * skia * fuzzy +xfa_png_image.in * * gdi * diff +xfa_rectangle_node.in * * gdi * diff +xfa_tiff_image.in * * gdi * diff +xfa_tiff_lzw_image.in * * gdi * diff +xfa_tiff_packbits_image.in * * gdi * diff # TODO(crbug.com/42271068): Remove after associated bug is fixed -bug_1015233.in * * * gdi * diff -bug_1099446.in * * * gdi * diff -bug_1161.in * * * gdi * diff -bug_1236.in * * * gdi_skia * diff -bug_1288_1.in * * * gdi_skia * diff -bug_1330.in * * * gdi * diff -bug_1395648.in * * * gdi_skia * diff -bug_1396266.in * * * gdi_skia * diff -bug_1430333.in * * * gdi_skia * diff -bug_1822.in * * * gdi * diff -bug_1847.in * * * gdi_skia * diff -bug_1949.in * * * gdi_skia * diff -bug_1995.in * * * gdi_skia * diff -bug_41153500.in * * * gdi * diff -bug_42270979_1.in * * * gdi * diff -bug_42270979_3.in * * * gdi * diff -bug_632.in * * * gdi * diff -bug_632.in * * * * fontations fuzzy=10,0.1,15 -bug_660850.in * * * gdi * diff -long_dashed_line.in * * * gdi * diff -matte.in * * * gdi_skia * diff +bug_1015233.in * * gdi * diff +bug_1099446.in * * gdi * diff +bug_1161.in * * gdi * diff +bug_1236.in * * gdi_skia * diff +bug_1288_1.in * * gdi_skia * diff +bug_1330.in * * gdi * diff +bug_1395648.in * * gdi_skia * diff +bug_1396266.in * * gdi_skia * diff +bug_1430333.in * * gdi_skia * diff +bug_1822.in * * gdi * diff +bug_1847.in * * gdi_skia * diff +bug_1949.in * * gdi_skia * diff +bug_1995.in * * gdi_skia * diff +bug_41153500.in * * gdi * diff +bug_42270979_1.in * * gdi * diff +bug_42270979_3.in * * gdi * diff +bug_632.in * * gdi * diff +bug_632.in * * * fontations fuzzy=10,0.1,15 +bug_660850.in * * gdi * diff +long_dashed_line.in * * gdi * diff +matte.in * * gdi_skia * diff # TODO(crbug.com/361002664): Remove after associated bug is fixed -smask_blend.in * * * gdi * diff +smask_blend.in * * gdi * diff # TODO(crbug.com/459586268): Remove this entry once macOS support for Intel # hardware goes away. The test expectation is just different enough from the ARM # rendering that fuzzy matching is not enough for it to match. The difference # looks like it may be due to several rounding errors combining for a bigger # than normal pixel value difference. -bug_1430333.in mac_x86 * * skia * diff -bug_1746.in mac_x86 * * skia * diff +bug_1430333.in mac_x86 * skia * diff +bug_1746.in mac_x86 * skia * diff # # Merged from SUPPRESSIONS_IMAGE_DIFF and SUPPRESSIONS_EXACT_MATCHING; these # name no test that appears above. # -2_9_stamp2.pdf mac * * skia * fuzzy -2_9_stamp2.pdf * * * * fontations fuzzy=10,0.1,15 -2_halftone.pdf mac * * skia * fuzzy -3_image_imagemask.pdf mac * * skia * fuzzy -FRC_3.5_CF_Strf_stmf_DefaultCryptFilter.pdf * * * * * blank -FRC_3.5_EncryptMetadata_T.pdf * * * * * blank -FRC_3.5_Encrypt_is_damage.pdf * * * * * blank -FRC_3.5_Filter_PubSec_SubFilter_s5.pdf * * * * * blank -FRC_3.5_Filter_PubSec_Sub_SubFilter_s4.pdf * * * * * blank -FRC_8.4.1_Annotations_Border.pdf mac * * skia * fuzzy -FRC_8.4.1_Annotations_Border.pdf * * * * fontations fuzzy=10,0.1,15 -MouseEvents.pdf * * * * * blank -Oneof.pdf * * * * * blank -annotation_circle.pdf mac * * skia * fuzzy -annotation_circle.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_circle_dash.pdf mac * * skia * fuzzy -annotation_circle_dash.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_ellipse.pdf mac * * skia * fuzzy -annotation_ellipse.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_ellipse_fill.pdf mac * * skia * fuzzy -annotation_ellipse_fill.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_ellipse_fill_dash.pdf mac * * skia * fuzzy -annotation_ellipse_fill_dash.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_freetext.pdf mac * * skia * fuzzy -annotation_freetext.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_ink.pdf mac * * skia * fuzzy -annotation_ink.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_ink_dash.pdf mac * * skia * fuzzy -annotation_ink_dash.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_ink_dot.pdf mac * * skia * fuzzy -annotation_ink_dot.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_ink_multiple.pdf mac * * skia * fuzzy -annotation_ink_multiple.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_square.pdf mac * * skia * fuzzy -annotation_square.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_square_dash.pdf mac * * skia * fuzzy -annotation_square_dash.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_squiggly.pdf mac * * skia * fuzzy -annotation_squiggly.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_squiggly_opacity.pdf mac * * skia * fuzzy -annotation_squiggly_opacity.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_strikeout.pdf mac * * skia * fuzzy -annotation_strikeout.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_text.pdf mac * * skia * fuzzy -annotation_text.pdf * * * * fontations fuzzy=10,0.1,15 -bug_651304.pdf * * * * * blank -ch_9_android.pdf mac * * skia * fuzzy -ch_9_android.pdf * * * * fontations fuzzy=10,0.1,15 -en_uicase_2_.pdf mac * * skia * fuzzy -en_uicase_2_.pdf * * * * fontations fuzzy=10,0.1,15 -image_foxit.pdf * * * * * fuzzy=10,0.35,10.0 -image_transformer_other.in mac * * skia * fuzzy -outline.pdf * * * * * blank -radial_shading_point_at_border.in mac * * skia * fuzzy -radial_shading_point_at_border_no_extend.in mac * * skia * fuzzy -shade.in mac * * skia * fuzzy -shading_2_15.pdf mac * * skia * fuzzy -shading_2_17.pdf mac * * skia * fuzzy -shading_2_4.pdf mac * * skia * fuzzy -shading_2_7.pdf mac * * skia * fuzzy -shading_2_8.pdf mac * * skia * fuzzy -shading_2_9.pdf mac * * skia * fuzzy -zh_file_structure.pdf mac * * skia * fuzzy -zh_file_structure.pdf * * * * fontations diff -zh_page.pdf mac * * skia * fuzzy -zh_page.pdf * * * * fontations fuzzy=20,0.1,15 -zh_webdav.pdf mac * * skia * fuzzy -zh_webdav.pdf * * * * fontations fuzzy=10,0.1,15 +2_9_stamp2.pdf mac * skia * fuzzy +2_9_stamp2.pdf * * * fontations fuzzy=10,0.1,15 +2_halftone.pdf mac * skia * fuzzy +3_image_imagemask.pdf mac * skia * fuzzy +FRC_3.5_CF_Strf_stmf_DefaultCryptFilter.pdf * * * * blank +FRC_3.5_EncryptMetadata_T.pdf * * * * blank +FRC_3.5_Encrypt_is_damage.pdf * * * * blank +FRC_3.5_Filter_PubSec_SubFilter_s5.pdf * * * * blank +FRC_3.5_Filter_PubSec_Sub_SubFilter_s4.pdf * * * * blank +FRC_8.4.1_Annotations_Border.pdf mac * skia * fuzzy +FRC_8.4.1_Annotations_Border.pdf * * * fontations fuzzy=10,0.1,15 +MouseEvents.pdf * * * * blank +Oneof.pdf * * * * blank +annotation_circle.pdf mac * skia * fuzzy +annotation_circle.pdf * * * fontations fuzzy=10,0.1,15 +annotation_circle_dash.pdf mac * skia * fuzzy +annotation_circle_dash.pdf * * * fontations fuzzy=10,0.1,15 +annotation_ellipse.pdf mac * skia * fuzzy +annotation_ellipse.pdf * * * fontations fuzzy=10,0.1,15 +annotation_ellipse_fill.pdf mac * skia * fuzzy +annotation_ellipse_fill.pdf * * * fontations fuzzy=10,0.1,15 +annotation_ellipse_fill_dash.pdf mac * skia * fuzzy +annotation_ellipse_fill_dash.pdf * * * fontations fuzzy=10,0.1,15 +annotation_freetext.pdf mac * skia * fuzzy +annotation_freetext.pdf * * * fontations fuzzy=10,0.1,15 +annotation_ink.pdf mac * skia * fuzzy +annotation_ink.pdf * * * fontations fuzzy=10,0.1,15 +annotation_ink_dash.pdf mac * skia * fuzzy +annotation_ink_dash.pdf * * * fontations fuzzy=10,0.1,15 +annotation_ink_dot.pdf mac * skia * fuzzy +annotation_ink_dot.pdf * * * fontations fuzzy=10,0.1,15 +annotation_ink_multiple.pdf mac * skia * fuzzy +annotation_ink_multiple.pdf * * * fontations fuzzy=10,0.1,15 +annotation_square.pdf mac * skia * fuzzy +annotation_square.pdf * * * fontations fuzzy=10,0.1,15 +annotation_square_dash.pdf mac * skia * fuzzy +annotation_square_dash.pdf * * * fontations fuzzy=10,0.1,15 +annotation_squiggly.pdf mac * skia * fuzzy +annotation_squiggly.pdf * * * fontations fuzzy=10,0.1,15 +annotation_squiggly_opacity.pdf mac * skia * fuzzy +annotation_squiggly_opacity.pdf * * * fontations fuzzy=10,0.1,15 +annotation_strikeout.pdf mac * skia * fuzzy +annotation_strikeout.pdf * * * fontations fuzzy=10,0.1,15 +annotation_text.pdf mac * skia * fuzzy +annotation_text.pdf * * * fontations fuzzy=10,0.1,15 +bug_651304.pdf * * * * blank +ch_9_android.pdf mac * skia * fuzzy +ch_9_android.pdf * * * fontations fuzzy=10,0.1,15 +en_uicase_2_.pdf mac * skia * fuzzy +en_uicase_2_.pdf * * * fontations fuzzy=10,0.1,15 +image_foxit.pdf * * * * fuzzy=10,0.35,10.0 +image_transformer_other.in mac * skia * fuzzy +outline.pdf * * * * blank +radial_shading_point_at_border.in mac * skia * fuzzy +radial_shading_point_at_border_no_extend.in mac * skia * fuzzy +shade.in mac * skia * fuzzy +shading_2_15.pdf mac * skia * fuzzy +shading_2_17.pdf mac * skia * fuzzy +shading_2_4.pdf mac * skia * fuzzy +shading_2_7.pdf mac * skia * fuzzy +shading_2_8.pdf mac * skia * fuzzy +shading_2_9.pdf mac * skia * fuzzy +zh_file_structure.pdf mac * skia * fuzzy +zh_file_structure.pdf * * * fontations diff +zh_page.pdf mac * skia * fuzzy +zh_page.pdf * * * fontations fuzzy=20,0.1,15 +zh_webdav.pdf mac * skia * fuzzy +zh_webdav.pdf * * * fontations fuzzy=10,0.1,15 # # Fontations, naming no test that appears above. # -2_color_lab.pdf * * * * fontations diff -FRC_4.5.3_DeviceCMYK_K1.pdf * * * * fontations diff -FRC_4.5.3_DeviceRGB_RG1.pdf * * * * fontations diff -FRC_8.5_Catalog_OpenAction.pdf linux,win * * * fontations diff -FRC_8.5_Page_O_URI.pdf * * * * fontations diff -bug_1021762.in * * * * fontations fuzzy -bug_601362.in * * * * fontations diff -bug_736703.in * * * * fontations diff -bug_846.in * * * * fontations diff +2_color_lab.pdf * * * fontations diff +FRC_4.5.3_DeviceCMYK_K1.pdf * * * fontations diff +FRC_4.5.3_DeviceRGB_RG1.pdf * * * fontations diff +FRC_8.5_Catalog_OpenAction.pdf linux,win * * fontations diff +FRC_8.5_Page_O_URI.pdf * * * fontations diff +bug_1021762.in * * * fontations fuzzy +bug_601362.in * * * fontations diff +bug_736703.in * * * fontations diff +bug_846.in * * * fontations diff # # Fontations fuzzy matching, naming no test that appears above. # -050_extra_m.pdf * * * * fontations fuzzy=10,0.1,15 -2_8_stamp1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_10_8.2.2_Prev_remove_all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_10_8.2.4__remove_ModDate_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_11_8.2.2_Prev_remove_obj.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_11_8.2.4__remove_ModDate_all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_12_8.2.2__Next_remove_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_12_8.2.4__remove_ModDate_obj_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_13_8.2.2__Next_remove_all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_13_8.2.4_remove_Size_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_14_8.2.2__Next_remove_obj.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_14_8.2.4_remove_Size_all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_15_8.2.2__Next_exchange.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_15_8.2.4_remove_Size_obj.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_16_8.2.2__Next_add.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_16_8.2.4__remove_CompressedSize__value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_17_8.2.2__T8.4_First_remove_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_17_8.2.4__remove_CompressedSize__all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_18_8.2.2__T8.4_First_remove_all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_18_8.2.4__remove_CompressedSize__obj.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_19_8.2.2__T8.4_First_remove_obj.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_19_8.2.4__remove_CreationDate_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_1_8.2.2__Title_edit.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_1_8.2.4__original.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_20_8.2.2__T8.4_First_remove_value2.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_20_8.2.4__remove_CreationDate_all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_21_8.2.2__T8.4_First_remove_all2.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_21_8.2.4__remove_CreationDate_obj.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_22_8.2.2__T8.4_First_remove_obj2.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_22_8.2.4__remove_Order_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_23_8.2.2__T8.4_Last_remove_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_23_8.2.4__remove_Order_all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_24_8.2.2__T8.4_Last_remove_all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_24_8.2.4__remove_Order_obj.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_25_8.2.2__T8.4_Last_remove_obj.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_26_8.2.2__T8.4_Last_remove_value2.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_27_8.2.2__T8.4_Last_remove_all2.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_28_8.2.2__T8.4_Last_remove_obj2.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_29_8.2.2__T8.4_First_Last_exchange.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_2_8.2.2__Title_remove_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_2_8.2.4__add_type_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_3.5_P_4_Password_1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_3.5_P__1852_Password_1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_3.5_P__2584_Password_1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_3.5_P__2616_Password_1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_3.5_P__2880_Password_1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_3.5_P__3376_Password_1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_3.5_P__3392_Password_1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_3.5_P__3608_Password_1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_3.5_P__3900_Password_1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_31_8.2.2_add_dest_entry.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_32_8.2.2_A_Support_action.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_33_8.2.2_A_empty.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_34_8.2.2_A_remove.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_35_8.2.2_A_remove_A_item.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_36_8.2.2_Dest.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_37_8.2.2_Dest_empty.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_38_8.2.2_Dest_remove.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_39_8.2.2_C_edit.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_3_8.2.2__Title_remove_all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_3_8.2.4__add_type_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.3_DeviceCMYK_k.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.3_DeviceGray_G1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.3_DeviceGray_g.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.3_DeviceRGB_rg.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.4_CalGray_gamma.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.4_CalGray_whitepoint.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.4_CalRGB_gamma.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.4_CalRGB_matrix.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.4_CalRGB_whitepoint.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.4_ICCBased.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.4_Lab.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.4_RI_Absolute.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.4_RI_Perceptual.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.4_RI_Relative.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.4_RI_Saturation.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.4_Separation.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.5_DeviceN.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4.5.5_Indexed.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_40_8.2.2_C_empty1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_41_8.2.2_C_empty2.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_42_8.2.2_C_empty3.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_43_8.2.2_C_empty.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_44_8.2.2_C_remove.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_45_8.2.2_F_edit_F_1_2_3.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_46_8.2.2_F_edit_F__1__2__3.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_47_8.2.2_F_edit_F_32__32.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_48_8.2.2_F_edit_F_100__100.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_49_8.2.2_F_empty.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4_8.2.2_Parent_edit2.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_4_8.2.4__remove_FileName_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_50_8.2.2_F_remove.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_51_8.2.2_T_8.4__Count_edit_count_100.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_52_8.2.2_T_8.4__Count_edit_count_0.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_53_8.2.2_T_8.4__Count_empty.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_54_8.2.2_T_8.4__Count_empty1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_55_8.2.2_T_8.4__Count_remove.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_56_8.2.2_C_edit_C__1.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_57_8.2.2_C_edit_C_2.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_58_8.2.2_Count_edit_count__2.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_5_8.2.2_Parent_remove_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_5_8.2.4__remove_FileName_all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_6_8.2.2_Parent_remove_all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_6_8.2.4__remove_FileName_obj.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_7_8.2.2_Parent_remove_obj.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_7_8.2.4__remove_Description_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.1_Annotations_AP_N_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.1_Annotations_AP_N_R_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.1_Annotations_C.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.1_Annotations_M_text_string_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.1_Annotations_P.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.1_Annotations_Rect.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.2_Annotation_Flags_F_Hidden.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.2_Annotation_Flags_F_Invisible.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.2_Annotation_Flags_F_Locked.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.2_Annotation_Flags_F_LockedContents.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.2_Annotation_Flags_F_NoRotate.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.2_Annotation_Flags_F_NoView.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.2_Annotation_Flags_F_NoZoom.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.2_Annotation_Flags_F_Print.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.2_Annotation_Flags_F_ReadOnly.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.2_Annotation_Flags_F_ToggleNoView.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_D_different_values.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_D_remove.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_I_different_values.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_I_remove.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_S_different_values_BE_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_S_different_values_BS_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_S_not_exist_BS_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_S_remove_BE_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_S_remove_BS_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_Type_add.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_Type_not_exist_default_.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.4.3_Border_Stypes_W_remove.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_Catalog_WC.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_DP.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_DS.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_Link_URL.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_Outline_A.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_Page_PV_Named_Phantom.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_Screen_Fo_JavaScript.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_Screen_Rendition.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_WP.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8.5_WS.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8_8.2.2_Parent_edit.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_8_8.2.4__remove__Description_all.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_9_8.2.2_Prev_remove_value.pdf * * * * fontations fuzzy=10,0.1,15 -FRC_9_8.2.4__remove__Description_obj.pdf * * * * fontations fuzzy=10,0.1,15 -annotation_highlight_no_content.pdf * * * * fontations fuzzy=10,0.1,15 -bug_113910.in * * * * fontations fuzzy=10,0.1,15 -bug_1308.pdf * * * * fontations fuzzy=15,0.1,15 -bug_1308_1.in * * * * fontations fuzzy=10,0.1,15 -bug_1355.in * * * * fontations fuzzy=15,0.1,15 -bug_1388_2.in * * * * fontations fuzzy=10,0.1,15 -bug_1388_3.in * * * * fontations fuzzy=10,0.1,15 -bug_1402.in * * * * fontations fuzzy=10,0.1,15 -bug_1752.in * * * * fontations fuzzy=10,0.1,15 -bug_1772.in * * * * fontations fuzzy=10,0.1,15 -bug_1922.in * * * * fontations fuzzy=10,0.1,15 -bug_42270459.in * * * * fontations fuzzy=10,0.1,15 -bug_432208037.in * * * * fontations fuzzy=10,0.1,15 -bug_493126_endobj_bug.pdf * * * * fontations fuzzy=10,0.1,15 -bug_493126_endobj_bug_weirdWS.pdf * * * * fontations fuzzy=10,0.1,15 -bug_524043_1.in * * * * fontations fuzzy=10,0.1,15 -bug_524043_2.in * * * * fontations fuzzy=10,0.1,15 -bug_524043_3.in * * * * fontations fuzzy=10,0.1,15 -bug_524043_4.in * * * * fontations fuzzy=10,0.1,15 -bug_524043_5.in * * * * fontations fuzzy=10,0.1,15 -bug_524043_7.in * * * * fontations fuzzy=10,0.1,15 -bug_528103.in * * * * fontations fuzzy=10,0.1,15 -bug_543018_1.in * * * * fontations fuzzy=10,0.1,15 -bug_543018_2.in * * * * fontations fuzzy=10,0.1,15 -bug_551258_1.in * * * * fontations fuzzy=10,0.1,15 -bug_665467.in * * * * fontations fuzzy=10,0.1,15 -bug_736695_3.in * * * * fontations fuzzy=10,0.1,15 -bug_820345.in * * * * fontations fuzzy=10,0.1,15 -bug_845697.in * * * * fontations fuzzy=10,0.1,15 -bug_909762.in * * * * fontations fuzzy=10,0.1,15 -bug_925736.pdf * * * * fontations fuzzy=10,0.1,15 -ch_7_10.pdf * * * * fontations fuzzy=10,0.1,15 -ch_7_11.pdf * * * * fontations fuzzy=10,0.1,15 -ch_7_12.pdf * * * * fontations fuzzy=10,0.1,15 -ch_7_14.pdf * * * * fontations fuzzy=10,0.1,15 -ch_7_15.pdf * * * * fontations fuzzy=10,0.1,15 -font_size.in * * * * fontations fuzzy=10,0.1,15 -form_textfield_selected_ltr.in * * * * fontations fuzzy=10,0.1,15 -form_textfield_selected_rtl.in * * * * fontations fuzzy=10,0.1,15 -foxittext.pdf * * * * fontations fuzzy=10,0.1,15 -freetext_annotation_with_da.in * * * * fontations fuzzy=10,0.1,15 -freetext_annotation_without_da.pdf * * * * fontations fuzzy=10,0.1,15 -generation_numbers1.pdf * * * * fontations fuzzy=10,0.1,15 -generation_numbers2.pdf * * * * fontations fuzzy=10,0.1,15 -password.in * * * * fontations fuzzy=10,0.1,15 -scrollable_widgets1.in * * * * fontations fuzzy=10,0.1,15 -test_m.pdf * * * * fontations fuzzy=10,0.1,15 +050_extra_m.pdf * * * fontations fuzzy=10,0.1,15 +2_8_stamp1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_10_8.2.2_Prev_remove_all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_10_8.2.4__remove_ModDate_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_11_8.2.2_Prev_remove_obj.pdf * * * fontations fuzzy=10,0.1,15 +FRC_11_8.2.4__remove_ModDate_all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_12_8.2.2__Next_remove_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_12_8.2.4__remove_ModDate_obj_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_13_8.2.2__Next_remove_all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_13_8.2.4_remove_Size_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_14_8.2.2__Next_remove_obj.pdf * * * fontations fuzzy=10,0.1,15 +FRC_14_8.2.4_remove_Size_all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_15_8.2.2__Next_exchange.pdf * * * fontations fuzzy=10,0.1,15 +FRC_15_8.2.4_remove_Size_obj.pdf * * * fontations fuzzy=10,0.1,15 +FRC_16_8.2.2__Next_add.pdf * * * fontations fuzzy=10,0.1,15 +FRC_16_8.2.4__remove_CompressedSize__value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_17_8.2.2__T8.4_First_remove_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_17_8.2.4__remove_CompressedSize__all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_18_8.2.2__T8.4_First_remove_all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_18_8.2.4__remove_CompressedSize__obj.pdf * * * fontations fuzzy=10,0.1,15 +FRC_19_8.2.2__T8.4_First_remove_obj.pdf * * * fontations fuzzy=10,0.1,15 +FRC_19_8.2.4__remove_CreationDate_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_1_8.2.2__Title_edit.pdf * * * fontations fuzzy=10,0.1,15 +FRC_1_8.2.4__original.pdf * * * fontations fuzzy=10,0.1,15 +FRC_20_8.2.2__T8.4_First_remove_value2.pdf * * * fontations fuzzy=10,0.1,15 +FRC_20_8.2.4__remove_CreationDate_all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_21_8.2.2__T8.4_First_remove_all2.pdf * * * fontations fuzzy=10,0.1,15 +FRC_21_8.2.4__remove_CreationDate_obj.pdf * * * fontations fuzzy=10,0.1,15 +FRC_22_8.2.2__T8.4_First_remove_obj2.pdf * * * fontations fuzzy=10,0.1,15 +FRC_22_8.2.4__remove_Order_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_23_8.2.2__T8.4_Last_remove_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_23_8.2.4__remove_Order_all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_24_8.2.2__T8.4_Last_remove_all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_24_8.2.4__remove_Order_obj.pdf * * * fontations fuzzy=10,0.1,15 +FRC_25_8.2.2__T8.4_Last_remove_obj.pdf * * * fontations fuzzy=10,0.1,15 +FRC_26_8.2.2__T8.4_Last_remove_value2.pdf * * * fontations fuzzy=10,0.1,15 +FRC_27_8.2.2__T8.4_Last_remove_all2.pdf * * * fontations fuzzy=10,0.1,15 +FRC_28_8.2.2__T8.4_Last_remove_obj2.pdf * * * fontations fuzzy=10,0.1,15 +FRC_29_8.2.2__T8.4_First_Last_exchange.pdf * * * fontations fuzzy=10,0.1,15 +FRC_2_8.2.2__Title_remove_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_2_8.2.4__add_type_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_3.5_P_4_Password_1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_3.5_P__1852_Password_1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_3.5_P__2584_Password_1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_3.5_P__2616_Password_1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_3.5_P__2880_Password_1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_3.5_P__3376_Password_1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_3.5_P__3392_Password_1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_3.5_P__3608_Password_1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_3.5_P__3900_Password_1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_31_8.2.2_add_dest_entry.pdf * * * fontations fuzzy=10,0.1,15 +FRC_32_8.2.2_A_Support_action.pdf * * * fontations fuzzy=10,0.1,15 +FRC_33_8.2.2_A_empty.pdf * * * fontations fuzzy=10,0.1,15 +FRC_34_8.2.2_A_remove.pdf * * * fontations fuzzy=10,0.1,15 +FRC_35_8.2.2_A_remove_A_item.pdf * * * fontations fuzzy=10,0.1,15 +FRC_36_8.2.2_Dest.pdf * * * fontations fuzzy=10,0.1,15 +FRC_37_8.2.2_Dest_empty.pdf * * * fontations fuzzy=10,0.1,15 +FRC_38_8.2.2_Dest_remove.pdf * * * fontations fuzzy=10,0.1,15 +FRC_39_8.2.2_C_edit.pdf * * * fontations fuzzy=10,0.1,15 +FRC_3_8.2.2__Title_remove_all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_3_8.2.4__add_type_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.3_DeviceCMYK_k.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.3_DeviceGray_G1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.3_DeviceGray_g.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.3_DeviceRGB_rg.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.4_CalGray_gamma.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.4_CalGray_whitepoint.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.4_CalRGB_gamma.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.4_CalRGB_matrix.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.4_CalRGB_whitepoint.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.4_ICCBased.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.4_Lab.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.4_RI_Absolute.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.4_RI_Perceptual.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.4_RI_Relative.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.4_RI_Saturation.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.4_Separation.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.5_DeviceN.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4.5.5_Indexed.pdf * * * fontations fuzzy=10,0.1,15 +FRC_40_8.2.2_C_empty1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_41_8.2.2_C_empty2.pdf * * * fontations fuzzy=10,0.1,15 +FRC_42_8.2.2_C_empty3.pdf * * * fontations fuzzy=10,0.1,15 +FRC_43_8.2.2_C_empty.pdf * * * fontations fuzzy=10,0.1,15 +FRC_44_8.2.2_C_remove.pdf * * * fontations fuzzy=10,0.1,15 +FRC_45_8.2.2_F_edit_F_1_2_3.pdf * * * fontations fuzzy=10,0.1,15 +FRC_46_8.2.2_F_edit_F__1__2__3.pdf * * * fontations fuzzy=10,0.1,15 +FRC_47_8.2.2_F_edit_F_32__32.pdf * * * fontations fuzzy=10,0.1,15 +FRC_48_8.2.2_F_edit_F_100__100.pdf * * * fontations fuzzy=10,0.1,15 +FRC_49_8.2.2_F_empty.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4_8.2.2_Parent_edit2.pdf * * * fontations fuzzy=10,0.1,15 +FRC_4_8.2.4__remove_FileName_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_50_8.2.2_F_remove.pdf * * * fontations fuzzy=10,0.1,15 +FRC_51_8.2.2_T_8.4__Count_edit_count_100.pdf * * * fontations fuzzy=10,0.1,15 +FRC_52_8.2.2_T_8.4__Count_edit_count_0.pdf * * * fontations fuzzy=10,0.1,15 +FRC_53_8.2.2_T_8.4__Count_empty.pdf * * * fontations fuzzy=10,0.1,15 +FRC_54_8.2.2_T_8.4__Count_empty1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_55_8.2.2_T_8.4__Count_remove.pdf * * * fontations fuzzy=10,0.1,15 +FRC_56_8.2.2_C_edit_C__1.pdf * * * fontations fuzzy=10,0.1,15 +FRC_57_8.2.2_C_edit_C_2.pdf * * * fontations fuzzy=10,0.1,15 +FRC_58_8.2.2_Count_edit_count__2.pdf * * * fontations fuzzy=10,0.1,15 +FRC_5_8.2.2_Parent_remove_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_5_8.2.4__remove_FileName_all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_6_8.2.2_Parent_remove_all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_6_8.2.4__remove_FileName_obj.pdf * * * fontations fuzzy=10,0.1,15 +FRC_7_8.2.2_Parent_remove_obj.pdf * * * fontations fuzzy=10,0.1,15 +FRC_7_8.2.4__remove_Description_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.1_Annotations_AP_N_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.1_Annotations_AP_N_R_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.1_Annotations_C.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.1_Annotations_M_text_string_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.1_Annotations_P.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.1_Annotations_Rect.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.2_Annotation_Flags_F_Hidden.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.2_Annotation_Flags_F_Invisible.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.2_Annotation_Flags_F_Locked.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.2_Annotation_Flags_F_LockedContents.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.2_Annotation_Flags_F_NoRotate.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.2_Annotation_Flags_F_NoView.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.2_Annotation_Flags_F_NoZoom.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.2_Annotation_Flags_F_Print.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.2_Annotation_Flags_F_ReadOnly.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.2_Annotation_Flags_F_ToggleNoView.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_D_different_values.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_D_remove.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_I_different_values.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_I_remove.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_S_different_values_BE_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_S_different_values_BS_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_S_not_exist_BS_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_S_remove_BE_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_S_remove_BS_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_Type_add.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_Type_not_exist_default_.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.4.3_Border_Stypes_W_remove.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_Catalog_WC.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_DP.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_DS.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_Link_URL.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_Outline_A.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_Page_PV_Named_Phantom.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_Screen_Fo_JavaScript.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_Screen_Rendition.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_WP.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8.5_WS.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8_8.2.2_Parent_edit.pdf * * * fontations fuzzy=10,0.1,15 +FRC_8_8.2.4__remove__Description_all.pdf * * * fontations fuzzy=10,0.1,15 +FRC_9_8.2.2_Prev_remove_value.pdf * * * fontations fuzzy=10,0.1,15 +FRC_9_8.2.4__remove__Description_obj.pdf * * * fontations fuzzy=10,0.1,15 +annotation_highlight_no_content.pdf * * * fontations fuzzy=10,0.1,15 +bug_113910.in * * * fontations fuzzy=10,0.1,15 +bug_1308.pdf * * * fontations fuzzy=15,0.1,15 +bug_1308_1.in * * * fontations fuzzy=10,0.1,15 +bug_1355.in * * * fontations fuzzy=15,0.1,15 +bug_1388_2.in * * * fontations fuzzy=10,0.1,15 +bug_1388_3.in * * * fontations fuzzy=10,0.1,15 +bug_1402.in * * * fontations fuzzy=10,0.1,15 +bug_1752.in * * * fontations fuzzy=10,0.1,15 +bug_1772.in * * * fontations fuzzy=10,0.1,15 +bug_1922.in * * * fontations fuzzy=10,0.1,15 +bug_42270459.in * * * fontations fuzzy=10,0.1,15 +bug_432208037.in * * * fontations fuzzy=10,0.1,15 +bug_493126_endobj_bug.pdf * * * fontations fuzzy=10,0.1,15 +bug_493126_endobj_bug_weirdWS.pdf * * * fontations fuzzy=10,0.1,15 +bug_524043_1.in * * * fontations fuzzy=10,0.1,15 +bug_524043_2.in * * * fontations fuzzy=10,0.1,15 +bug_524043_3.in * * * fontations fuzzy=10,0.1,15 +bug_524043_4.in * * * fontations fuzzy=10,0.1,15 +bug_524043_5.in * * * fontations fuzzy=10,0.1,15 +bug_524043_7.in * * * fontations fuzzy=10,0.1,15 +bug_528103.in * * * fontations fuzzy=10,0.1,15 +bug_543018_1.in * * * fontations fuzzy=10,0.1,15 +bug_543018_2.in * * * fontations fuzzy=10,0.1,15 +bug_551258_1.in * * * fontations fuzzy=10,0.1,15 +bug_665467.in * * * fontations fuzzy=10,0.1,15 +bug_736695_3.in * * * fontations fuzzy=10,0.1,15 +bug_820345.in * * * fontations fuzzy=10,0.1,15 +bug_845697.in * * * fontations fuzzy=10,0.1,15 +bug_909762.in * * * fontations fuzzy=10,0.1,15 +bug_925736.pdf * * * fontations fuzzy=10,0.1,15 +ch_7_10.pdf * * * fontations fuzzy=10,0.1,15 +ch_7_11.pdf * * * fontations fuzzy=10,0.1,15 +ch_7_12.pdf * * * fontations fuzzy=10,0.1,15 +ch_7_14.pdf * * * fontations fuzzy=10,0.1,15 +ch_7_15.pdf * * * fontations fuzzy=10,0.1,15 +font_size.in * * * fontations fuzzy=10,0.1,15 +form_textfield_selected_ltr.in * * * fontations fuzzy=10,0.1,15 +form_textfield_selected_rtl.in * * * fontations fuzzy=10,0.1,15 +foxittext.pdf * * * fontations fuzzy=10,0.1,15 +freetext_annotation_with_da.in * * * fontations fuzzy=10,0.1,15 +freetext_annotation_without_da.pdf * * * fontations fuzzy=10,0.1,15 +generation_numbers1.pdf * * * fontations fuzzy=10,0.1,15 +generation_numbers2.pdf * * * fontations fuzzy=10,0.1,15 +password.in * * * fontations fuzzy=10,0.1,15 +scrollable_widgets1.in * * * fontations fuzzy=10,0.1,15 +test_m.pdf * * * fontations fuzzy=10,0.1,15 diff --git a/testing/tools/suppressor.py b/testing/tools/suppressor.py index 058e5f4c93..b589f4e088 100755 --- a/testing/tools/suppressor.py +++ b/testing/tools/suppressor.py @@ -43,13 +43,12 @@ def _ParseFuzzyAction(token): # the test file name, which is unconstrained. _VALID_COLUMN_VALUES = { 1: {'*', 'win', 'mac', 'mac_arm', 'mac_x86', 'linux'}, - 2: {'*', 'nov8', 'v8'}, - 3: {'*', 'noxfa', 'xfa'}, - 4: {'*', 'agg', 'gdi', 'gdi_agg', 'gdi_skia', 'skia'}, - 5: {'*', 'freetype', 'fontations'}, + 2: {'*', 'nov8', 'v8', 'xfa'}, + 3: {'*', 'agg', 'gdi', 'gdi_agg', 'gdi_skia', 'skia'}, + 4: {'*', 'freetype', 'fontations'}, } -# Legal keywords for the action in column 6. +# Legal keywords for the action in column 5. _VALID_ACTIONS = {'diff', 'blank', 'fuzzy', 'skip'} @@ -71,8 +70,8 @@ def _ParseAction(token): def _SuppressionSpecificity(item): - """Scores columns 1-5 as a little-endian specificity bitmask.""" - return sum((item[col] != '*') << (col - 1) for col in range(1, 6)) + """Scores columns 1-4 as a little-endian specificity bitmask.""" + return sum((item[col] != '*') << (col - 1) for col in range(1, 5)) class Suppressor: @@ -93,19 +92,23 @@ def __init__(self, finder, features, js_disabled, xfa_disabled, self._LoadSuppressions(finder) def _LoadSuppressions(self, finder): - v8_option = "v8" if self.has_v8 else "nov8" - xfa_option = "xfa" if self.has_xfa else "noxfa" + if not self.has_v8: + engine_option = 'nov8' + elif not self.has_xfa: + engine_option = 'v8' + else: + engine_option = 'xfa' with open(os.path.join(finder.TestingDir(), 'SUPPRESSIONS')) as f: os_name = common.os_name() mac_platform = common.mac_platform() if os_name == 'mac' else None fuzzy_specificity = {} for item in self._ExtractSuppressions(f): - if len(item) != 7: + if len(item) != 6: raise ValueError(f'Unexpected column count in suppressions: {item}') _ValidatePredicates(item) - keyword, flags = _ParseAction(item[6]) - if not self._MatchSuppression(item, os_name, mac_platform, v8_option, - xfa_option, self.rendering_option, + keyword, flags = _ParseAction(item[5]) + if not self._MatchSuppression(item, os_name, mac_platform, + engine_option, self.rendering_option, self.font_engine): continue filename = item[0] @@ -146,16 +149,14 @@ def _MatchRenderer(rendering_option, rendering_option_column): return 'gdi' in rendering_option_column return False - def _MatchSuppression(self, item, os_name, mac_platform, js, xfa, + def _MatchSuppression(self, item, os_name, mac_platform, engine, rendering_option, font_engine): os_column = item[1].split(",") - js_column = item[2].split(",") - xfa_column = item[3].split(",") - rendering_option_column = item[4].split(",") - font_engine_column = item[5].split(",") + engine_column = item[2].split(",") + rendering_option_column = item[3].split(",") + font_engine_column = item[4].split(",") return (Suppressor._MatchOs(os_name, mac_platform, os_column) and - ('*' in js_column or js in js_column) and - ('*' in xfa_column or xfa in xfa_column) and + ('*' in engine_column or engine in engine_column) and Suppressor._MatchRenderer(rendering_option, rendering_option_column) and ('*' in font_engine_column or font_engine in font_engine_column)) From 69b5290105869b1bb7f0a15b0b12eedf3258fbe5 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Tue, 13 Oct 2026 12:04:52 -0700 Subject: [PATCH 12/37] Add TODO to revert CFXPath expectations for open, 3-sided paths Add some TODOs as a first step towards reverting a behavior change pdfium-review.googlesource.com/c/80912 made. When a path only forms 3 sides of a rectangle and it has not been closed, that should not count as a rectangle. Bug: 42270691, 572902676 Change-Id: I5cac1867a77b7dbb351d50f3d1df5fee78e1cac6 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160750 Commit-Queue: Lei Zhang Reviewed-by: Andy Phan --- core/fxge/cfx_path_unittest.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/fxge/cfx_path_unittest.cpp b/core/fxge/cfx_path_unittest.cpp index fd8b3894bd..34b57025d6 100644 --- a/core/fxge/cfx_path_unittest.cpp +++ b/core/fxge/cfx_path_unittest.cpp @@ -28,19 +28,21 @@ TEST(CFXPath, BasicTest) { EXPECT_FALSE(path.IsRect()); EXPECT_EQ(CFX_FloatRect(), path.GetBoundingBox()); - // 4 points without a closed path makes a rect. + // 4 points without a closed path does not make a rect. path.AppendPoint({0, 0}, CFX_Path::Point::Type::kMove); path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); path.AppendPoint({1, 1}, CFX_Path::Point::Type::kLine); path.AppendPoint({1, 0}, CFX_Path::Point::Type::kLine); EXPECT_EQ(4u, path.GetPoints().size()); + // TODO(thestig): Change this back to the behavior before + // https://pdfium-review.googlesource.com/c/80912 since the rect is open. EXPECT_TRUE(path.IsRect()); rect = path.GetRect(nullptr); ASSERT_TRUE(rect.has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), rect.value()); EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), path.GetBoundingBox()); - // 4 points with a closed path also makes a rect. + // 4 points with a closed path makes a rect. path.ClosePath(); EXPECT_EQ(4u, path.GetPoints().size()); EXPECT_TRUE(path.IsRect()); @@ -140,6 +142,7 @@ TEST(CFXPath, Hexagon) { } TEST(CFXPath, ClosePath) { + // The path starts out open. CFX_Path path; path.AppendLine({0, 0}, {0, 1}); path.AppendLine({0, 1}, {1, 1}); @@ -147,6 +150,8 @@ TEST(CFXPath, ClosePath) { ASSERT_EQ(4u, path.GetPoints().size()); EXPECT_EQ(CFX_Path::Point::Type::kLine, path.GetType(3)); EXPECT_FALSE(path.IsClosingFigure(3)); + // TODO(thestig): Change this back to the behavior before + // https://pdfium-review.googlesource.com/c/80912 since the rect is open. EXPECT_TRUE(path.IsRect()); std::optional rect = path.GetRect(nullptr); ASSERT_TRUE(rect.has_value()); @@ -154,6 +159,7 @@ TEST(CFXPath, ClosePath) { const CFX_Matrix kIdentityMatrix; ASSERT_TRUE(kIdentityMatrix.IsIdentity()); + // TODO(thestig): This should return std::nullopt. rect = path.GetRect(&kIdentityMatrix); ASSERT_TRUE(rect.has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), rect.value()); From b02da6c41c467c45b20c1a052b4b6ed515a519f2 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Tue, 13 Oct 2026 13:06:52 -0700 Subject: [PATCH 13/37] Stop recognizing open, 3-sided paths as rectangles. Revert a behavior change pdfium-review.googlesource.com/c/80912 made, since a path that only forms 3 sides of a rectangle and has not been closed is not a rectangle. Bug: 42270691, 572902676 Change-Id: I31da35b950e281f0815bfb17b40befd14f21b5cb Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160673 Commit-Queue: Lei Zhang Reviewed-by: Andy Phan --- core/fxge/cfx_path.cpp | 7 ++++++- core/fxge/cfx_path_unittest.cpp | 18 +++++------------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/core/fxge/cfx_path.cpp b/core/fxge/cfx_path.cpp index e67fd4b9b7..05ee70bfd6 100644 --- a/core/fxge/cfx_path.cpp +++ b/core/fxge/cfx_path.cpp @@ -22,6 +22,10 @@ bool IsRectPreTransform(const std::vector& points) { return false; } + if (points.size() == 4 && !points[3].close_figure_) { + return false; + } + if (points.size() == 5 && points[0].point_ != points[4].point_) { return false; } @@ -91,7 +95,8 @@ std::vector GetNormalizedPoints( const std::vector& points) { DCHECK(PathPointsNeedNormalization(points)); - if (points[0].point_ != points.back().point_) { + if (!points.back().close_figure_ && + points[0].point_ != points.back().point_) { return {}; } diff --git a/core/fxge/cfx_path_unittest.cpp b/core/fxge/cfx_path_unittest.cpp index 34b57025d6..022dfd6be2 100644 --- a/core/fxge/cfx_path_unittest.cpp +++ b/core/fxge/cfx_path_unittest.cpp @@ -34,12 +34,9 @@ TEST(CFXPath, BasicTest) { path.AppendPoint({1, 1}, CFX_Path::Point::Type::kLine); path.AppendPoint({1, 0}, CFX_Path::Point::Type::kLine); EXPECT_EQ(4u, path.GetPoints().size()); - // TODO(thestig): Change this back to the behavior before - // https://pdfium-review.googlesource.com/c/80912 since the rect is open. - EXPECT_TRUE(path.IsRect()); + EXPECT_FALSE(path.IsRect()); rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), rect.value()); + EXPECT_FALSE(rect.has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), path.GetBoundingBox()); // 4 points with a closed path makes a rect. @@ -150,19 +147,14 @@ TEST(CFXPath, ClosePath) { ASSERT_EQ(4u, path.GetPoints().size()); EXPECT_EQ(CFX_Path::Point::Type::kLine, path.GetType(3)); EXPECT_FALSE(path.IsClosingFigure(3)); - // TODO(thestig): Change this back to the behavior before - // https://pdfium-review.googlesource.com/c/80912 since the rect is open. - EXPECT_TRUE(path.IsRect()); + EXPECT_FALSE(path.IsRect()); std::optional rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), rect.value()); + EXPECT_FALSE(rect.has_value()); const CFX_Matrix kIdentityMatrix; ASSERT_TRUE(kIdentityMatrix.IsIdentity()); - // TODO(thestig): This should return std::nullopt. rect = path.GetRect(&kIdentityMatrix); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), rect.value()); + EXPECT_FALSE(rect.has_value()); path.ClosePath(); ASSERT_EQ(4u, path.GetPoints().size()); From e8ff093accb8d171f996c0a059c5adbd55b08bc4 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Tue, 13 Oct 2026 14:45:47 -0700 Subject: [PATCH 14/37] Hide ByteStringPool details inside bytestring_pool.cpp Convert ByteStringPool into an interface with ByteStringPool::Create() and a pure virtual Intern() method, and move the absl::flat_hash_set implementation into ByteStringPoolImpl in bytestring_pool.cpp. This avoids exposing absl/container/flat_hash_set.h in bytestring_pool.h. Since bytestring_pool.h gets transitively included in many translation units, explosing flat_hash_set.h increases the Chromium compile size by ~450 MB, as seen on crrev.com/c/8563220. TAG=agy CONV=9d52233e-f437-4c0d-acb6-07f402d6540c Change-Id: Iaecae19ee53ce97e57e793f4962c2e8865b1a295 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160690 Reviewed-by: Tom Sepez Commit-Queue: Lei Zhang --- .../parser/cpdf_indirect_object_holder.cpp | 2 +- core/fxcrt/bytestring_pool.cpp | 30 +++++++++++++++---- core/fxcrt/bytestring_pool.h | 15 ++++++---- core/fxcrt/bytestring_pool_unittest.cpp | 11 +++---- 4 files changed, 40 insertions(+), 18 deletions(-) diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp index 6e02e258af..b63dc4715e 100644 --- a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp +++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp @@ -23,7 +23,7 @@ const CPDF_Object* FilterInvalidObjNum(const CPDF_Object* obj) { } // namespace CPDF_IndirectObjectHolder::CPDF_IndirectObjectHolder() - : byte_string_pool_(std::make_unique()) {} + : byte_string_pool_(ByteStringPool::Create()) {} CPDF_IndirectObjectHolder::~CPDF_IndirectObjectHolder() { byte_string_pool_.DeleteObject(); // Make weak. diff --git a/core/fxcrt/bytestring_pool.cpp b/core/fxcrt/bytestring_pool.cpp index eda2e8be5c..0439e650ef 100644 --- a/core/fxcrt/bytestring_pool.cpp +++ b/core/fxcrt/bytestring_pool.cpp @@ -6,17 +6,35 @@ #include "core/fxcrt/bytestring_pool.h" +#include + +#include "third_party/abseil-cpp/absl/container/flat_hash_set.h" + namespace fxcrt { -ByteStringPool::ByteStringPool() = default; +namespace { -ByteStringPool::~ByteStringPool() = default; +class ByteStringPoolImpl final : public ByteStringPool { + public: + ByteStringPoolImpl() = default; + ~ByteStringPoolImpl() override = default; -ByteString ByteStringPool::Intern(const ByteString& str) { - if (str.IsEmpty()) { - return str; + ByteString Intern(const ByteString& str) override { + if (str.IsEmpty()) { + return str; + } + return *pool_.insert(str).first; } - return *pool_.insert(str).first; + + private: + absl::flat_hash_set pool_; +}; + +} // namespace + +// static +std::unique_ptr ByteStringPool::Create() { + return std::make_unique(); } } // namespace fxcrt diff --git a/core/fxcrt/bytestring_pool.h b/core/fxcrt/bytestring_pool.h index fec36cd53d..3395313506 100644 --- a/core/fxcrt/bytestring_pool.h +++ b/core/fxcrt/bytestring_pool.h @@ -7,20 +7,23 @@ #ifndef CORE_FXCRT_BYTESTRING_POOL_H_ #define CORE_FXCRT_BYTESTRING_POOL_H_ +#include + #include "core/fxcrt/bytestring.h" -#include "third_party/abseil-cpp/absl/container/flat_hash_set.h" namespace fxcrt { class ByteStringPool { public: - ByteStringPool(); - ~ByteStringPool(); + // Never returns nullptr. + static std::unique_ptr Create(); + + virtual ~ByteStringPool() = default; - ByteString Intern(const ByteString& str); + virtual ByteString Intern(const ByteString& str) = 0; - private: - absl::flat_hash_set pool_; + protected: + ByteStringPool() = default; }; } // namespace fxcrt diff --git a/core/fxcrt/bytestring_pool_unittest.cpp b/core/fxcrt/bytestring_pool_unittest.cpp index c518479973..253140f805 100644 --- a/core/fxcrt/bytestring_pool_unittest.cpp +++ b/core/fxcrt/bytestring_pool_unittest.cpp @@ -10,7 +10,8 @@ namespace fxcrt { TEST(ByteStringPool, Basic) { - ByteStringPool pool; + std::unique_ptr pool = ByteStringPool::Create(); + ASSERT_TRUE(pool); ByteString null1; ByteString null2; @@ -22,10 +23,10 @@ TEST(ByteStringPool, Basic) { EXPECT_TRUE(null2.IsEmpty()); EXPECT_NE(goats1.c_str(), goats2.c_str()); - ByteString interned_null1 = pool.Intern(null1); - ByteString interned_null2 = pool.Intern(null2); - ByteString interned_goats1 = pool.Intern(goats1); - ByteString interned_goats2 = pool.Intern(goats2); + ByteString interned_null1 = pool->Intern(null1); + ByteString interned_null2 = pool->Intern(null2); + ByteString interned_goats1 = pool->Intern(goats1); + ByteString interned_goats2 = pool->Intern(goats2); // Strings are logically equal after being interned. EXPECT_EQ(null1, interned_null1); From ff0c9276af3168ac989e0c71752e34814d6d2065 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Tue, 13 Oct 2026 15:47:41 -0700 Subject: [PATCH 15/37] Add unit tests for 4-point rects with redundant or collinear points CFX_Path::IsRect(), GetRect(), and GetRectOppositeCorner() recognize both 4-point and 5-point rectangles, but PathPointsNeedNormalization() and GetNormalizedPoints() currently only normalize paths that have more than 5 points and repeat the first point at the end. As a result, 4-point rectangles with duplicate or collinear edge points (such as paths closed with CFX_Path::ClosePath() instead of repeating the start point) are not recognized as rectangles. Add/update tests in cpdf_pagecontentgenerator_unittest.cpp and cfx_path_unittest.cpp to document the current behavior, along with TODOs to fix this. In particular, add one more scenario in CFXPath.FivePointRect, and remove the identical scenario from CFXPath.NotRect. TAG=agy CONV=e2fb55f5-ba6e-4820-9194-44fb5bf14b16 Bug: 572902676 Change-Id: Ife1104f4417a9f9e9a612f856e31848806cfa7d7 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160710 Commit-Queue: Lei Zhang Reviewed-by: Andy Phan --- .../cpdf_pagecontentgenerator_unittest.cpp | 16 +++ core/fxge/cfx_path_unittest.cpp | 99 +++++++++++++++++-- 2 files changed, 109 insertions(+), 6 deletions(-) diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp index 6ee064113b..374aa38413 100644 --- a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp +++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp @@ -106,6 +106,22 @@ TEST_F(CPDFPageContentGeneratorTest, ProcessRect) { buf.str(""); TestProcessPath(&generator, &buf, pPathObj.get()); EXPECT_EQ("q 0 0 100 100 re n Q\n", ByteString(buf)); + + // Same as above, but closed without repeating the first point. + pPathObj = std::make_unique(); + pPathObj->path().AppendPoint(CFX_PointF(0, 0), CFX_Path::Point::Type::kMove); + pPathObj->path().AppendPoint(CFX_PointF(50, 0), CFX_Path::Point::Type::kLine); + pPathObj->path().AppendPoint(CFX_PointF(100, 0), + CFX_Path::Point::Type::kLine); + pPathObj->path().AppendPoint(CFX_PointF(100, 100), + CFX_Path::Point::Type::kLine); + pPathObj->path().AppendPointAndClose(CFX_PointF(0, 100), + CFX_Path::Point::Type::kLine); + buf.str(""); + TestProcessPath(&generator, &buf, pPathObj.get()); + // TODO(thestig): Should output "q 0 0 100 100 re n Q\n". + EXPECT_EQ("q 0 0 m 50 0 l 100 0 l 100 100 l 0 100 l h n Q\n", + ByteString(buf)); } TEST_F(CPDFPageContentGeneratorTest, Bug937) { diff --git a/core/fxge/cfx_path_unittest.cpp b/core/fxge/cfx_path_unittest.cpp index 022dfd6be2..9fce6e15f0 100644 --- a/core/fxge/cfx_path_unittest.cpp +++ b/core/fxge/cfx_path_unittest.cpp @@ -210,6 +210,48 @@ TEST(CFXPath, FivePointRect) { rect = path.GetRect(nullptr); ASSERT_TRUE(rect.has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); + + // 4-point rect with a duplicate point. + path.Clear(); + path.AppendPoint({0, 0}, CFX_Path::Point::Type::kMove); + path.AppendPoint({0, 0}, CFX_Path::Point::Type::kLine); + path.AppendPoint({2, 0}, CFX_Path::Point::Type::kLine); + path.AppendPoint({2, 1}, CFX_Path::Point::Type::kLine); + path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); + ASSERT_EQ(5u, path.GetPoints().size()); + EXPECT_FALSE(path.IsRect()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); + + path.ClosePath(); + // TODO(thestig): Should be a rect. + EXPECT_FALSE(path.IsRect()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); + + // 4-point rect with a collinear point on an edge. + path.Clear(); + path.AppendPoint({0, 0}, CFX_Path::Point::Type::kMove); + path.AppendPoint({1, 0}, CFX_Path::Point::Type::kLine); + path.AppendPoint({2, 0}, CFX_Path::Point::Type::kLine); + path.AppendPoint({2, 1}, CFX_Path::Point::Type::kLine); + path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); + ASSERT_EQ(5u, path.GetPoints().size()); + // TODO(thestig): Should be a rect. + EXPECT_FALSE(path.IsRect()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); + + // 4-point rect with a collinear point on the closing edge. + path.Clear(); + path.AppendPoint({0, 0}, CFX_Path::Point::Type::kMove); + path.AppendPoint({2, 0}, CFX_Path::Point::Type::kLine); + path.AppendPoint({2, 1}, CFX_Path::Point::Type::kLine); + path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); + path.AppendPointAndClose({0, 0.1f}, CFX_Path::Point::Type::kLine); + ASSERT_EQ(5u, path.GetPoints().size()); + // TODO(thestig): Should be a rect. + EXPECT_FALSE(path.IsRect()); + rect = path.GetRect(nullptr); + EXPECT_FALSE(rect.has_value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); } TEST(CFXPath, SixPlusPointRect) { @@ -245,6 +287,21 @@ TEST(CFXPath, SixPlusPointRect) { ASSERT_TRUE(rect.has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); + + // 4-point rect with duplicate points that does not repeat the start point at + // the end. + path.Clear(); + path.AppendPoint({0, 0}, CFX_Path::Point::Type::kMove); + path.AppendPoint({0, 0}, CFX_Path::Point::Type::kLine); + path.AppendPoint({2, 0}, CFX_Path::Point::Type::kLine); + path.AppendPoint({2, 1}, CFX_Path::Point::Type::kLine); + path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); + path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); + ASSERT_EQ(6u, path.GetPoints().size()); + // TODO(thestig): Should be a rect. + EXPECT_FALSE(path.IsRect()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); } TEST(CFXPath, GetRectOppositeCorner) { @@ -274,6 +331,17 @@ TEST(CFXPath, GetRectOppositeCorner) { ASSERT_EQ(CFX_PointF(2, 0), path.GetPoints()[2].point_); EXPECT_EQ(CFX_PointF(2, 1), path.GetRectOppositeCorner()); + // Same as above, but closed without repeating the first point. + path.Clear(); + path.AppendPoint({0, 0}, CFX_Path::Point::Type::kMove); + path.AppendPoint({1, 0}, CFX_Path::Point::Type::kLine); + path.AppendPoint({2, 0}, CFX_Path::Point::Type::kLine); + path.AppendPoint({2, 1}, CFX_Path::Point::Type::kLine); + path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); + ASSERT_EQ(CFX_PointF(2, 0), path.GetPoints()[2].point_); + // TODO(thestig): Should return CFX_PointF(2, 1). + EXPECT_FALSE(path.GetRectOppositeCorner().has_value()); + path.Clear(); path.AppendPoint({0, 0}, CFX_Path::Point::Type::kMove); path.AppendPoint({2, 0}, CFX_Path::Point::Type::kLine); @@ -331,6 +399,20 @@ TEST(CFXPath, SixPlusPointRectWithCollinearPoints) { ASSERT_TRUE(rect.has_value()); EXPECT_EQ(CFX_FloatRect(60, 70, 62, 72), rect.value()); + // Same as above, but closed without repeating the first point. + path.Clear(); + path.AppendPoint({0, 0}, CFX_Path::Point::Type::kMove); + path.AppendPoint({1, 0}, CFX_Path::Point::Type::kLine); + path.AppendPoint({2, 0}, CFX_Path::Point::Type::kLine); + path.AppendPoint({2, 1}, CFX_Path::Point::Type::kLine); + path.AppendPoint({1, 1}, CFX_Path::Point::Type::kLine); + path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); + ASSERT_EQ(6u, path.GetPoints().size()); + // TODO(thestig): Should be a rect. + EXPECT_FALSE(path.IsRect()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); + EXPECT_FALSE(path.GetRect(&kScaleMatrix).has_value()); + // A point that goes past the corner and back is not in between its // neighbors, so the path is not a rectangle. path.Clear(); @@ -367,12 +449,6 @@ TEST(CFXPath, NotRect) { EXPECT_FALSE(rect.has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); - path.ClosePath(); - EXPECT_FALSE(path.IsRect()); - rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); - path.Clear(); path.AppendPoint({0, 0}, CFX_Path::Point::Type::kMove); path.AppendPoint({2, 0}, CFX_Path::Point::Type::kLine); @@ -425,6 +501,17 @@ TEST(CFXPath, NotRect) { EXPECT_FALSE(rect.has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); + path.Clear(); + path.AppendPoint({0, 0}, CFX_Path::Point::Type::kMove); + path.AppendPoint({2, 0}, CFX_Path::Point::Type::kLine); + path.AppendPoint({2, 1}, CFX_Path::Point::Type::kLine); + path.AppendPointAndClose({2, 1}, CFX_Path::Point::Type::kLine); + path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); + EXPECT_FALSE(path.IsRect()); + rect = path.GetRect(nullptr); + EXPECT_FALSE(rect.has_value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); + path.Clear(); path.AppendPoint({0, 0}, CFX_Path::Point::Type::kMove); path.AppendPoint({2, 0}, CFX_Path::Point::Type::kLine); From 69efacb11fa5bee156017811629ae996296fb7d4 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Tue, 13 Oct 2026 17:22:21 -0700 Subject: [PATCH 16/37] Normalize 4-point rects with redundant or collinear points in CFX_Path CFX_Path::IsRect(), GetRect(), and GetRectOppositeCorner() recognize both 4-point rectangles (where the start point is not repeated at the end) and 5-point rectangles (where the start point is repeated at the end). However, PathPointsNeedNormalization() and GetNormalizedPoints() only normalized paths with more than 5 points that repeated the start point at the end. As a result, 4-point rectangles with duplicate or collinear edge points, such as paths closed via CFX_Path::ClosePath() / FPDFPath_Close(), were not recognized as rectangles in memory, even though saving and reloading the PDF via CPDF_StreamContentParser::Handle_ClosePath() appended the start point and turned them into rectangles. Update PathPointsNeedNormalization() to also normalize 5-point paths where the first and last points differ, and update GetNormalizedPoints() to normalize paths with differing first and last points to 4 points while preserving `close_figure_` when deleting a final closing duplicate or collinear point. TAG=agy CONV=e2fb55f5-ba6e-4820-9194-44fb5bf14b16 Bug: 572902676 Change-Id: Ie01ae75c1441666bd488104716f8a08804361684 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160711 Reviewed-by: Andy Phan Commit-Queue: Lei Zhang --- .../cpdf_pagecontentgenerator_unittest.cpp | 4 +- core/fxge/cfx_path.cpp | 54 +++++++++++-------- core/fxge/cfx_path_unittest.cpp | 41 +++++++------- 3 files changed, 57 insertions(+), 42 deletions(-) diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp index 374aa38413..031d7edecb 100644 --- a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp +++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp @@ -119,9 +119,7 @@ TEST_F(CPDFPageContentGeneratorTest, ProcessRect) { CFX_Path::Point::Type::kLine); buf.str(""); TestProcessPath(&generator, &buf, pPathObj.get()); - // TODO(thestig): Should output "q 0 0 100 100 re n Q\n". - EXPECT_EQ("q 0 0 m 50 0 l 100 0 l 100 100 l 0 100 l h n Q\n", - ByteString(buf)); + EXPECT_EQ("q 0 0 100 100 re n Q\n", ByteString(buf)); } TEST_F(CPDFPageContentGeneratorTest, Bug937) { diff --git a/core/fxge/cfx_path.cpp b/core/fxge/cfx_path.cpp index 05ee70bfd6..0845a69648 100644 --- a/core/fxge/cfx_path.cpp +++ b/core/fxge/cfx_path.cpp @@ -72,7 +72,8 @@ CFX_FloatRect CreateRectFromPoints(const CFX_PointF& p1, const CFX_PointF& p2) { } bool PathPointsNeedNormalization(const std::vector& points) { - return points.size() > 5; + return points.size() > 5 || + (points.size() == 5 && points[0].point_ != points[4].point_); } // Returns whether `point` lies strictly between `prev` and `next` on a @@ -95,49 +96,60 @@ std::vector GetNormalizedPoints( const std::vector& points) { DCHECK(PathPointsNeedNormalization(points)); - if (!points.back().close_figure_ && - points[0].point_ != points.back().point_) { + const size_t expected_size = points[0].point_ == points.back().point_ ? 5 : 4; + if (expected_size == 4 && !points.back().close_figure_) { return {}; } std::vector normalized; - normalized.reserve(6); + normalized.reserve(expected_size + 1); normalized.push_back(points[0]); for (auto it = points.begin() + 1; it != points.end(); ++it) { - // Exactly 5 points left. Stop normalizing and take what is left. - if (normalized.size() + std::distance(it, points.end()) == 5) { + // Exactly `expected_size` points left. Stop normalizing and take what is + // left. + if (normalized.size() + std::distance(it, points.end()) == expected_size) { std::copy(it, points.end(), std::back_inserter(normalized)); break; } const auto& point = *it; - if (point.type_ == CFX_Path::Point::Type::kLine && !point.close_figure_ && + if (point.type_ == CFX_Path::Point::Type::kLine && !normalized.back().close_figure_) { - // If the line does not move, skip this point. - if (point.point_ == normalized.back().point_) { - continue; - } - - // If the line continues straight on along the same edge, skip this - // point. Some PDF generators emit a rectangle with an extra vertex in - // the middle of an edge. const auto next = std::next(it); - if (next != points.end() && next->type_ == CFX_Path::Point::Type::kLine && - IsBetweenOnAxisAlignedLine(normalized.back().point_, point.point_, - next->point_)) { - continue; + if (!point.close_figure_) { + // If the line does not move, skip this point. + if (point.point_ == normalized.back().point_) { + continue; + } + + // If the line continues straight on along the same edge, skip this + // point. Some PDF generators emit a rectangle with an extra vertex in + // the middle of an edge. + if (next != points.end() && + next->type_ == CFX_Path::Point::Type::kLine && + IsBetweenOnAxisAlignedLine(normalized.back().point_, point.point_, + next->point_)) { + continue; + } + } else if (next == points.end()) { + if (point.point_ == normalized.back().point_ || + IsBetweenOnAxisAlignedLine(normalized.back().point_, point.point_, + points[0].point_)) { + normalized.back().close_figure_ = true; + continue; + } } } normalized.push_back(point); // Too many points. Not considered as a rectangle. - if (normalized.size() > 5) { + if (normalized.size() > expected_size) { return {}; } } - DCHECK_EQ(5u, normalized.size()); + DCHECK_EQ(expected_size, normalized.size()); return normalized; } diff --git a/core/fxge/cfx_path_unittest.cpp b/core/fxge/cfx_path_unittest.cpp index 9fce6e15f0..c8e127422e 100644 --- a/core/fxge/cfx_path_unittest.cpp +++ b/core/fxge/cfx_path_unittest.cpp @@ -223,9 +223,10 @@ TEST(CFXPath, FivePointRect) { EXPECT_FALSE(path.GetRect(nullptr).has_value()); path.ClosePath(); - // TODO(thestig): Should be a rect. - EXPECT_FALSE(path.IsRect()); - EXPECT_FALSE(path.GetRect(nullptr).has_value()); + EXPECT_TRUE(path.IsRect()); + rect = path.GetRect(nullptr); + ASSERT_TRUE(rect.has_value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); // 4-point rect with a collinear point on an edge. path.Clear(); @@ -235,9 +236,10 @@ TEST(CFXPath, FivePointRect) { path.AppendPoint({2, 1}, CFX_Path::Point::Type::kLine); path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); ASSERT_EQ(5u, path.GetPoints().size()); - // TODO(thestig): Should be a rect. - EXPECT_FALSE(path.IsRect()); - EXPECT_FALSE(path.GetRect(nullptr).has_value()); + EXPECT_TRUE(path.IsRect()); + rect = path.GetRect(nullptr); + ASSERT_TRUE(rect.has_value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); // 4-point rect with a collinear point on the closing edge. path.Clear(); @@ -247,10 +249,10 @@ TEST(CFXPath, FivePointRect) { path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); path.AppendPointAndClose({0, 0.1f}, CFX_Path::Point::Type::kLine); ASSERT_EQ(5u, path.GetPoints().size()); - // TODO(thestig): Should be a rect. - EXPECT_FALSE(path.IsRect()); + EXPECT_TRUE(path.IsRect()); rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); + ASSERT_TRUE(rect.has_value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); } @@ -298,9 +300,10 @@ TEST(CFXPath, SixPlusPointRect) { path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); ASSERT_EQ(6u, path.GetPoints().size()); - // TODO(thestig): Should be a rect. - EXPECT_FALSE(path.IsRect()); - EXPECT_FALSE(path.GetRect(nullptr).has_value()); + EXPECT_TRUE(path.IsRect()); + rect = path.GetRect(nullptr); + ASSERT_TRUE(rect.has_value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); } @@ -339,8 +342,7 @@ TEST(CFXPath, GetRectOppositeCorner) { path.AppendPoint({2, 1}, CFX_Path::Point::Type::kLine); path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); ASSERT_EQ(CFX_PointF(2, 0), path.GetPoints()[2].point_); - // TODO(thestig): Should return CFX_PointF(2, 1). - EXPECT_FALSE(path.GetRectOppositeCorner().has_value()); + EXPECT_EQ(CFX_PointF(2, 1), path.GetRectOppositeCorner()); path.Clear(); path.AppendPoint({0, 0}, CFX_Path::Point::Type::kMove); @@ -408,10 +410,13 @@ TEST(CFXPath, SixPlusPointRectWithCollinearPoints) { path.AppendPoint({1, 1}, CFX_Path::Point::Type::kLine); path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); ASSERT_EQ(6u, path.GetPoints().size()); - // TODO(thestig): Should be a rect. - EXPECT_FALSE(path.IsRect()); - EXPECT_FALSE(path.GetRect(nullptr).has_value()); - EXPECT_FALSE(path.GetRect(&kScaleMatrix).has_value()); + EXPECT_TRUE(path.IsRect()); + rect = path.GetRect(nullptr); + ASSERT_TRUE(rect.has_value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); + rect = path.GetRect(&kScaleMatrix); + ASSERT_TRUE(rect.has_value()); + EXPECT_EQ(CFX_FloatRect(60, 70, 62, 72), rect.value()); // A point that goes past the corner and back is not in between its // neighbors, so the path is not a rectangle. From c2cae14c8b50981469b82bc75224c260be482cbe Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Tue, 13 Oct 2026 18:40:21 -0700 Subject: [PATCH 17/37] Use CFX_Path::GetRectOppositeCorner() in more places In CPDF_ClipPath::AppendPathWithAutoMerge() and CPDF_ContentParser::CheckClip(), use GetRectOppositeCorner() and avoid assuming the point at index 2 is always the opposite corner. After this, CPDF_Path::IsRect() is dead code, so delete it. Change-Id: Id2ad3fc4e7d2e7b782bedad56946f91f522608fd Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160770 Reviewed-by: Andy Phan Commit-Queue: Lei Zhang --- core/fpdfapi/page/cpdf_clippath.cpp | 8 +++++--- core/fpdfapi/page/cpdf_contentparser.cpp | 11 ++++++++--- core/fpdfapi/page/cpdf_path.cpp | 4 ---- core/fpdfapi/page/cpdf_path.h | 1 - 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/core/fpdfapi/page/cpdf_clippath.cpp b/core/fpdfapi/page/cpdf_clippath.cpp index 9e06109c47..36bd95f4a8 100644 --- a/core/fpdfapi/page/cpdf_clippath.cpp +++ b/core/fpdfapi/page/cpdf_clippath.cpp @@ -6,6 +6,7 @@ #include "core/fpdfapi/page/cpdf_clippath.h" +#include #include #include "core/fpdfapi/page/cpdf_textobject.h" @@ -86,10 +87,11 @@ void CPDF_ClipPath::AppendPathWithAutoMerge( PathData* pData = ref_.GetPrivateCopy(); if (!pData->path_and_type_list_.empty()) { const CPDF_Path& old_path = pData->path_and_type_list_.back().first; - if (old_path.IsRect()) { + std::optional corner = old_path.GetRectOppositeCorner(); + if (corner.has_value()) { CFX_PointF point0 = old_path.GetPoint(0); - CFX_PointF point2 = old_path.GetPoint(2); - CFX_FloatRect old_rect(point0.x, point0.y, point2.x, point2.y); + CFX_FloatRect old_rect(point0.x, point0.y, corner.value().x, + corner.value().y); CFX_FloatRect new_rect = path.GetBoundingBox(); if (old_rect.Contains(new_rect)) { pData->path_and_type_list_.pop_back(); diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp index 1d6bd7b678..fe7a97316c 100644 --- a/core/fpdfapi/page/cpdf_contentparser.cpp +++ b/core/fpdfapi/page/cpdf_contentparser.cpp @@ -6,6 +6,7 @@ #include "core/fpdfapi/page/cpdf_contentparser.h" +#include #include #include @@ -253,15 +254,19 @@ CPDF_ContentParser::Stage CPDF_ContentParser::CheckClip() { if (clip_path.GetTextCount() > 0) { continue; } + if (pObj->IsShading()) { + continue; + } CPDF_Path path = clip_path.GetPath(0); - if (!path.IsRect() || pObj->IsShading()) { + std::optional corner = path.GetRectOppositeCorner(); + if (!corner.has_value()) { continue; } CFX_PointF point0 = path.GetPoint(0); - CFX_PointF point2 = path.GetPoint(2); - CFX_FloatRect old_rect(point0.x, point0.y, point2.x, point2.y); + CFX_FloatRect old_rect(point0.x, point0.y, corner.value().x, + corner.value().y); if (old_rect.Contains(pObj->GetRect())) { clip_path.SetNull(); } diff --git a/core/fpdfapi/page/cpdf_path.cpp b/core/fpdfapi/page/cpdf_path.cpp index 74469b5ab5..33f9be9d00 100644 --- a/core/fpdfapi/page/cpdf_path.cpp +++ b/core/fpdfapi/page/cpdf_path.cpp @@ -33,10 +33,6 @@ CFX_FloatRect CPDF_Path::GetBoundingBoxForStrokePath(float line_width, return ref_.GetObject()->GetBoundingBoxForStrokePath(line_width, miter_limit); } -bool CPDF_Path::IsRect() const { - return ref_.GetObject()->IsRect(); -} - std::optional CPDF_Path::GetRectOppositeCorner() const { return ref_.GetObject()->GetRectOppositeCorner(); } diff --git a/core/fpdfapi/page/cpdf_path.h b/core/fpdfapi/page/cpdf_path.h index ff5907ef9b..4d72e9da11 100644 --- a/core/fpdfapi/page/cpdf_path.h +++ b/core/fpdfapi/page/cpdf_path.h @@ -30,7 +30,6 @@ class CPDF_Path { CFX_FloatRect GetBoundingBoxForStrokePath(float line_width, float miter_limit) const; - bool IsRect() const; std::optional GetRectOppositeCorner() const; void Transform(const CFX_Matrix& matrix); From e764cc088a62b5f0510a73bed4e19c88c9af50bc Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Tue, 13 Oct 2026 18:43:02 -0700 Subject: [PATCH 18/37] Guard against re-entrant destruction of the CJS_Runtime Prevent a (somewhat) misbehaving embedder from tearing down the runtime while a callback is still in-flight. Bug: 572237007 Change-Id: I003a6b67703305c465a2ed0845f4274df93ed5af Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160614 Commit-Queue: Lei Zhang Reviewed-by: Lei Zhang --- fxjs/cjs_app.cpp | 6 ++++++ fxjs/cjs_runtime.cpp | 1 + 2 files changed, 7 insertions(+) diff --git a/fxjs/cjs_app.cpp b/fxjs/cjs_app.cpp index f56b06625c..d18663d595 100644 --- a/fxjs/cjs_app.cpp +++ b/fxjs/cjs_app.cpp @@ -282,7 +282,10 @@ CJS_Result CJS_App::beep(CJS_Runtime* pRuntime, type = pRuntime->ToInt32Reentrant(params[0]); } + pRuntime->BeginBlock(); pRuntime->GetFormFillEnv()->JS_appBeep(type); + pRuntime->EndBlock(); + return CJS_Result::Success(); } @@ -579,8 +582,11 @@ CJS_Result CJS_App::response(CJS_Runtime* pRuntime, static constexpr int kMaxWideChars = 1024; static constexpr int kMaxBytes = kMaxWideChars * sizeof(uint16_t); auto buffer = FixedSizeDataVector::Zeroed(kMaxBytes); + + pRuntime->BeginBlock(); int byte_length = pRuntime->GetFormFillEnv()->JS_appResponse( swQuestion, swTitle, swDefault, swLabel, bPassword, buffer.span()); + pRuntime->EndBlock(); if (byte_length < 0 || byte_length > kMaxBytes) { return CJS_Result::Failure(JSMessage::kParamTooLongError); diff --git a/fxjs/cjs_runtime.cpp b/fxjs/cjs_runtime.cpp index 75c55fa339..dc0403ad41 100644 --- a/fxjs/cjs_runtime.cpp +++ b/fxjs/cjs_runtime.cpp @@ -86,6 +86,7 @@ CJS_Runtime::CJS_Runtime(CPDFSDK_FormFillEnvironment* pFormFillEnv) } CJS_Runtime::~CJS_Runtime() { + CHECK(!IsBlocking()); NotifyObservers(); ReleaseEngine(); if (isolate_managed_) { From e34a93404af600aca68880d1b26e2eca00db52f7 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Tue, 13 Oct 2026 18:44:24 -0700 Subject: [PATCH 19/37] Check custom property name length in CSS declaration parsers Commit 21e954b59fce changed CFX_CSSSyntaxParser::GetCurrentString() to return a string view instead of taking an out-parameter length, leaving `iLen2` in CFX_CSSStyleSelector::AppendInlineStyle() and `iValueLen` in CFX_CSSStyleSheet::LoadStyleRule() permanently zero. Replace the stale length checks with !wsName.IsEmpty() so custom CSS properties reach CFX_CSSDeclaration::AddProperty(). Update CFX_CSSDeclaration::empty() to check both properties_ and custom_properties_ so style rules containing only custom properties are not discarded. Add unit tests covering custom CSS properties in both inline styles and stylesheet rules. Bug: 573263143 Change-Id: Ib9cddf49d6687a34ab2c4195d2dc70eaf74e2aa3 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160850 Reviewed-by: Lei Zhang Commit-Queue: Lei Zhang --- core/fxcrt/css/cfx_cssdeclaration.h | 4 +++- .../fxcrt/css/cfx_cssdeclaration_unittest.cpp | 23 +++++++++++++++++++ core/fxcrt/css/cfx_cssstyleselector.cpp | 5 ++-- core/fxcrt/css/cfx_cssstylesheet.cpp | 3 +-- core/fxcrt/css/cfx_cssstylesheet_unittest.cpp | 23 +++++++++++++++++++ 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/core/fxcrt/css/cfx_cssdeclaration.h b/core/fxcrt/css/cfx_cssdeclaration.h index c55a0ef67d..563e30ef34 100644 --- a/core/fxcrt/css/cfx_cssdeclaration.h +++ b/core/fxcrt/css/cfx_cssdeclaration.h @@ -35,7 +35,9 @@ class CFX_CSSDeclaration { RetainPtr GetProperty(CFX_CSSProperty eProperty, bool* bImportant) const; - bool empty() const { return properties_.empty(); } + bool empty() const { + return properties_.empty() && custom_properties_.empty(); + } const_prop_iterator begin() const { return properties_.begin(); } const_prop_iterator end() const { return properties_.end(); } diff --git a/core/fxcrt/css/cfx_cssdeclaration_unittest.cpp b/core/fxcrt/css/cfx_cssdeclaration_unittest.cpp index 67fe06bd20..31f2542455 100644 --- a/core/fxcrt/css/cfx_cssdeclaration_unittest.cpp +++ b/core/fxcrt/css/cfx_cssdeclaration_unittest.cpp @@ -9,6 +9,10 @@ #include #include "core/fxcrt/css/cfx_csscolorvalue.h" +#include "core/fxcrt/css/cfx_csscomputedstyle.h" +#include "core/fxcrt/css/cfx_cssstyleselector.h" +#include "core/fxcrt/retain_ptr.h" +#include "core/fxcrt/widestring.h" #include "testing/gtest/include/gtest/gtest.h" TEST(CFXCSSDeclarationTest, HexEncodingParsing) { @@ -56,3 +60,22 @@ TEST(CFXCSSDeclarationTest, RGBEncodingParsing) { ASSERT_TRUE(maybe_color.has_value()); EXPECT_EQ(0xFF80FF30u, maybe_color.value()); } + +TEST(CFXCSSDeclarationTest, CustomPropertiesInInlineStyle) { + CFX_CSSStyleSelector selector; + RetainPtr style = selector.CreateComputedStyle(nullptr); + selector.ComputeStyle( + {}, L"color: #ff0000; xfa-spacerun: yes; tab-interval: 24pt", L"", + style.Get()); + + EXPECT_EQ(0xFFFF0000u, style->GetColor()); + + WideString value; + EXPECT_TRUE(style->GetCustomStyle(L"xfa-spacerun", &value)); + EXPECT_EQ(L"yes", value); + + EXPECT_TRUE(style->GetCustomStyle(L"tab-interval", &value)); + EXPECT_EQ(L"24pt", value); + + EXPECT_FALSE(style->GetCustomStyle(L"nonexistent", &value)); +} diff --git a/core/fxcrt/css/cfx_cssstyleselector.cpp b/core/fxcrt/css/cfx_cssstyleselector.cpp index 049b86cacc..46f5affed7 100644 --- a/core/fxcrt/css/cfx_cssstyleselector.cpp +++ b/core/fxcrt/css/cfx_cssstyleselector.cpp @@ -156,7 +156,6 @@ void CFX_CSSStyleSelector::AppendInlineStyle(CFX_CSSDeclaration* pDecl, auto pSyntax = std::make_unique(style.AsStringView()); pSyntax->SetParseOnlyDeclarations(); - int32_t iLen2 = 0; const CFX_CSSData::Property* property = nullptr; WideString wsName; while (true) { @@ -168,12 +167,12 @@ void CFX_CSSStyleSelector::AppendInlineStyle(CFX_CSSDeclaration* pDecl, wsName = WideString(strValue); } } else if (eStatus == CFX_CSSSyntaxParser::Status::kPropertyValue) { - if (property || iLen2 > 0) { + if (property || !wsName.IsEmpty()) { WideStringView strValue = pSyntax->GetCurrentString(); if (!strValue.IsEmpty()) { if (property) { pDecl->AddProperty(property, strValue); - } else if (iLen2 > 0) { + } else { pDecl->AddProperty(wsName, WideString(strValue)); } } diff --git a/core/fxcrt/css/cfx_cssstylesheet.cpp b/core/fxcrt/css/cfx_cssstylesheet.cpp index 5f25eb3c7f..3928a29faf 100644 --- a/core/fxcrt/css/cfx_cssstylesheet.cpp +++ b/core/fxcrt/css/cfx_cssstylesheet.cpp @@ -46,7 +46,6 @@ CFX_CSSSyntaxParser::Status CFX_CSSStyleSheet::LoadStyleRule( CFX_CSSSyntaxParser* pSyntax) { std::vector> selectors; CFX_CSSStyleRule* pStyleRule = nullptr; - int32_t iValueLen = 0; const CFX_CSSData::Property* property = nullptr; WideString wsName; while (true) { @@ -68,7 +67,7 @@ CFX_CSSSyntaxParser::Status CFX_CSSStyleSheet::LoadStyleRule( break; } case CFX_CSSSyntaxParser::Status::kPropertyValue: { - if (property || iValueLen > 0) { + if (property || !wsName.IsEmpty()) { WideStringView strValue = pSyntax->GetCurrentString(); auto* decl = pStyleRule->GetDeclaration(); if (!strValue.IsEmpty()) { diff --git a/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp b/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp index 97f43a3feb..fb773320af 100644 --- a/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp +++ b/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp @@ -10,6 +10,7 @@ #include #include "core/fxcrt/check.h" +#include "core/fxcrt/css/cfx_csscustomproperty.h" #include "core/fxcrt/css/cfx_cssdeclaration.h" #include "core/fxcrt/css/cfx_cssenumvalue.h" #include "core/fxcrt/css/cfx_cssnumbervalue.h" @@ -331,3 +332,25 @@ TEST_F(CFXCSSStyleSheetTest, ParseWithUnterminatedCommentInProperty) { TEST_F(CFXCSSStyleSheetTest, ParseWithUnterminatedCommentInValue) { LoadAndVerifyRuleCount(L"a { border-bottom: /*2.5pc; }", 1); } + +TEST_F(CFXCSSStyleSheetTest, ParseOnlyCustomProperty) { + LoadAndVerifyDecl(L"a { xfa-spacerun: yes; }", {L"a"}, 0); + auto it = decl_->custom_begin(); + ASSERT_NE(it, decl_->custom_end()); + EXPECT_EQ(L"xfa-spacerun", (*it)->name()); + EXPECT_EQ(L"yes", (*it)->value()); + ++it; + EXPECT_EQ(it, decl_->custom_end()); +} + +TEST_F(CFXCSSStyleSheetTest, ParseMixedStandardAndCustomProperties) { + LoadAndVerifyDecl(L"a { border-left: 2.5pc; xfa-spacerun: yes; }", {L"a"}, 1); + VerifyFloat(CFX_CSSProperty::BorderLeftWidth, 2.5, + CFX_CSSNumber::Unit::kPicas); + auto it = decl_->custom_begin(); + ASSERT_NE(it, decl_->custom_end()); + EXPECT_EQ(L"xfa-spacerun", (*it)->name()); + EXPECT_EQ(L"yes", (*it)->value()); + ++it; + EXPECT_EQ(it, decl_->custom_end()); +} From c9c74443cc98129ff54593e6d7bb4727b8ac8829 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Tue, 13 Oct 2026 19:08:04 -0700 Subject: [PATCH 20/37] Remove ShouldDrawDeviceText() from CFX_RenderDevice This keeps platform-specific device text eligibility checks inside the concrete device drivers rather than in CFX_RenderDevice, removes a redundant ShouldDrawDeviceText() call from the Windows printer path, and ensures non-rasterizing drivers will still receive DrawDeviceText() calls on macOS. Instead, since it is interrogating a font, make it an Apple-only method of CFX_Font. Bug: 573199238 Change-Id: I0a107edd4a47c7f22a3e9ffea7becd3e00f05493 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160830 Reviewed-by: Lei Zhang Commit-Queue: Lei Zhang --- core/fxge/apple/fx_apple_impl.cpp | 4 ++-- core/fxge/cfx_font.cpp | 21 +++++++++++++++++++++ core/fxge/cfx_font.h | 1 + core/fxge/cfx_renderdevice.cpp | 25 ++----------------------- core/fxge/skia/fx_skia_device.cpp | 6 ++++++ 5 files changed, 32 insertions(+), 25 deletions(-) diff --git a/core/fxge/apple/fx_apple_impl.cpp b/core/fxge/apple/fx_apple_impl.cpp index 2283be3e28..163e09c540 100644 --- a/core/fxge/apple/fx_apple_impl.cpp +++ b/core/fxge/apple/fx_apple_impl.cpp @@ -110,8 +110,8 @@ bool CFX_AggDeviceDriver::DrawDeviceText( const CFX_Matrix& mtObject2Device, float font_size, uint32_t color, - const CFX_TextRenderOptions& /*options*/) { - if (!font) { + const CFX_TextRenderOptions& options) { + if (!font || !font->ShouldDrawDeviceText(options)) { return false; } diff --git a/core/fxge/cfx_font.cpp b/core/fxge/cfx_font.cpp index 532d05e878..831d3f9c6c 100644 --- a/core/fxge/cfx_font.cpp +++ b/core/fxge/cfx_font.cpp @@ -27,6 +27,7 @@ #include "core/fxge/cfx_glyphcache.h" #include "core/fxge/cfx_path.h" #include "core/fxge/cfx_substfont.h" +#include "core/fxge/cfx_textrenderoptions.h" #include "core/fxge/fx_font.h" namespace { @@ -322,6 +323,26 @@ bool CFX_Font::IsSubstFontBold() const { } #endif +#if BUILDFLAG(IS_APPLE) +bool CFX_Font::ShouldDrawDeviceText( + const CFX_TextRenderOptions& options) const { + if (options.font_is_cid) { + return false; + } + + const ByteString ps_name = GetPsName(); + if (ps_name.Contains("+ZJHL")) { + return false; + } + + if (ps_name == "CNAAJI+cmex10") { + return false; + } + + return true; +} +#endif + ByteString CFX_Font::GetPsName() const { if (!face_) { return ByteString(); diff --git a/core/fxge/cfx_font.h b/core/fxge/cfx_font.h index b6501a4bc8..6482ac44d9 100644 --- a/core/fxge/cfx_font.h +++ b/core/fxge/cfx_font.h @@ -137,6 +137,7 @@ class CFX_Font { #if BUILDFLAG(IS_APPLE) void* GetPlatformFont() const { return platform_font_; } void SetPlatformFont(void* font) { platform_font_ = font; } + bool ShouldDrawDeviceText(const CFX_TextRenderOptions& options) const; #endif private: diff --git a/core/fxge/cfx_renderdevice.cpp b/core/fxge/cfx_renderdevice.cpp index c3dde6656c..7dc92e0af8 100644 --- a/core/fxge/cfx_renderdevice.cpp +++ b/core/fxge/cfx_renderdevice.cpp @@ -309,25 +309,6 @@ void DrawNormalTextHelper(const RetainPtr& bitmap, } } -bool ShouldDrawDeviceText(const CFX_Font* font, - const CFX_TextRenderOptions& options) { -#if BUILDFLAG(IS_APPLE) - if (options.font_is_cid) { - return false; - } - - const ByteString bsPsName = font->GetPsName(); - if (bsPsName.Contains("+ZJHL")) { - return false; - } - - if (bsPsName == "CNAAJI+cmex10") { - return false; - } -#endif - return true; -} - // Returns true if the path is a 3-point path that draws A->B->A and forms a // zero area, or a 2-point path which draws A->B. bool CheckSimpleLinePath(pdfium::span points, @@ -1180,8 +1161,7 @@ bool CFX_RenderDevice::DrawNormalText(pdfium::span pCharPos, #if BUILDFLAG(IS_WIN) if (GetDeviceType() == DeviceType::kPrinter) { - if (ShouldDrawDeviceText(font, options) && - device_driver_->DrawDeviceText(pCharPos, font, mtText2Device, font_size, + if (device_driver_->DrawDeviceText(pCharPos, font, mtText2Device, font_size, fill_color, text_options)) { return true; } @@ -1194,8 +1174,7 @@ bool CFX_RenderDevice::DrawNormalText(pdfium::span pCharPos, #endif if (try_native_text && options.native_text) { - if (ShouldDrawDeviceText(font, options) && - device_driver_->DrawDeviceText(pCharPos, font, mtText2Device, font_size, + if (device_driver_->DrawDeviceText(pCharPos, font, mtText2Device, font_size, fill_color, text_options)) { return true; } diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp index 144d7469b2..ebf768461a 100644 --- a/core/fxge/skia/fx_skia_device.cpp +++ b/core/fxge/skia/fx_skia_device.cpp @@ -765,6 +765,12 @@ bool CFX_SkiaDeviceDriver::DrawDeviceText( float font_size, uint32_t color, const CFX_TextRenderOptions& options) { +#if BUILDFLAG(IS_APPLE) + if (!pFont->ShouldDrawDeviceText(options)) { + return false; + } +#endif + // `SkTextBlob` is built from `pFont`'s font data. If `pFont` doesn't contain // any font data, each text blob will have zero area to be drawn and the // drawing command will be rejected. In this case, fall back to drawing From affabff846464fff587818f1458132b0965b8ee0 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Tue, 13 Oct 2026 19:11:41 -0700 Subject: [PATCH 21/37] Add CFX_GEModule::PlatformIface::DestroyPlatformFont() Add DestroyPlatformFont() to pair with CreatePlatformFont() on CFX_GEModule::PlatformIface under IS_APPLE. This allows CFX_Font::ReleasePlatformResource() to move from fx_apple_impl.cpp into cfx_font.cpp alongside the rest of CFX_Font. Change-Id: I01e730dcf380e36b80cf356b2e9dc530641e8bd5 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160652 Commit-Queue: Lei Zhang Reviewed-by: Lei Zhang --- core/fxge/apple/capple_platform.cpp | 4 ++++ core/fxge/apple/capple_platform.h | 1 + core/fxge/apple/fx_apple_impl.cpp | 10 ---------- core/fxge/cfx_font.cpp | 7 +++++++ core/fxge/cfx_gemodule.h | 1 + 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/core/fxge/apple/capple_platform.cpp b/core/fxge/apple/capple_platform.cpp index 95dab74bb0..9dc55297f1 100644 --- a/core/fxge/apple/capple_platform.cpp +++ b/core/fxge/apple/capple_platform.cpp @@ -165,6 +165,10 @@ void* CApplePlatform::CreatePlatformFont( return quartz_2d_.CreateFont(font_span); } +void CApplePlatform::DestroyPlatformFont(void* font) { + quartz_2d_.DestroyFont(font); +} + // static std::unique_ptr CFX_GEModule::PlatformIface::Create() { diff --git a/core/fxge/apple/capple_platform.h b/core/fxge/apple/capple_platform.h index 0baeb8ac1c..00b719dee0 100644 --- a/core/fxge/apple/capple_platform.h +++ b/core/fxge/apple/capple_platform.h @@ -22,6 +22,7 @@ class CApplePlatform final : public CFX_GEModule::PlatformIface { void Terminate() override; std::unique_ptr CreateDefaultSystemFontInfo() override; void* CreatePlatformFont(pdfium::span font_span) override; + void DestroyPlatformFont(void* font) override; CQuartz2D quartz_2d_; }; diff --git a/core/fxge/apple/fx_apple_impl.cpp b/core/fxge/apple/fx_apple_impl.cpp index 163e09c540..cbf003a55d 100644 --- a/core/fxge/apple/fx_apple_impl.cpp +++ b/core/fxge/apple/fx_apple_impl.cpp @@ -176,13 +176,3 @@ bool CFX_AggDeviceDriver::DrawDeviceText( } } // namespace pdfium - -void CFX_Font::ReleasePlatformResource() { - if (platform_font_) { - CQuartz2D& quartz2d = - static_cast(CFX_GEModule::Get()->GetPlatform()) - ->quartz_2d_; - quartz2d.DestroyFont(platform_font_); - platform_font_ = nullptr; - } -} diff --git a/core/fxge/cfx_font.cpp b/core/fxge/cfx_font.cpp index 831d3f9c6c..04aec880f8 100644 --- a/core/fxge/cfx_font.cpp +++ b/core/fxge/cfx_font.cpp @@ -341,6 +341,13 @@ bool CFX_Font::ShouldDrawDeviceText( return true; } + +void CFX_Font::ReleasePlatformResource() { + if (platform_font_) { + CFX_GEModule::Get()->GetPlatform()->DestroyPlatformFont(platform_font_); + platform_font_ = nullptr; + } +} #endif ByteString CFX_Font::GetPsName() const { diff --git a/core/fxge/cfx_gemodule.h b/core/fxge/cfx_gemodule.h index e17f37daf7..4275eaf88d 100644 --- a/core/fxge/cfx_gemodule.h +++ b/core/fxge/cfx_gemodule.h @@ -61,6 +61,7 @@ class CFX_GEModule { CreateDefaultSystemFontInfo() = 0; #if BUILDFLAG(IS_APPLE) virtual void* CreatePlatformFont(pdfium::span font_span) = 0; + virtual void DestroyPlatformFont(void* font) = 0; #endif }; From bb7b5e65a083cadc9a81c38af314e2e8fdd6c897 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Tue, 13 Oct 2026 19:39:19 -0700 Subject: [PATCH 22/37] Use display lists for text removal tests in FPDFEditEmbedderTest Replace fragile golden PNG image comparisons in FPDFEditEmbedderTest text removal tests with display list text inspections. The display list approach inspects the emitted text directly, avoiding rasterization, hinting, and font engine discrepancies between FreeType and Fontations/ Skia. Delete 22 obsolete golden PNG expectation files and remove the now unused kHelloWorldRemovedPng constant. Change-Id: I1f296f748e7ea025e3a5c63d51cbd2a7e9e85bf4 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160050 Reviewed-by: Lei Zhang Commit-Queue: Lei Zhang --- .../cpdf_security_handler_embeddertest.cpp | 19 +- fpdfsdk/fpdf_edit_embeddertest.cpp | 225 ++++++------------ testing/embedder_test_constants.h | 4 - .../blank_page_200x200.dump.txt | 6 + .../embedder_tests/encrypted.dump.txt | 11 + .../embedder_tests/encrypted_agg.png | Bin 3498 -> 0 bytes .../embedder_tests/encrypted_agg_mac.png | Bin 3555 -> 0 bytes .../embedder_tests/encrypted_skia_linux.png | Bin 3410 -> 0 bytes .../embedder_tests/encrypted_skia_mac.png | Bin 3318 -> 0 bytes .../embedder_tests/encrypted_skia_win.png | Bin 2332 -> 0 bytes .../embedder_tests/hello_world.dump.txt | 8 + .../hello_world_removed.dump.txt | 7 + .../hello_world_removed_agg.png | Bin 729 -> 0 bytes .../hello_world_removed_agg_mac.png | Bin 710 -> 0 bytes .../hello_world_removed_hello_world.dump.txt | 7 + .../hello_world_removed_hello_world_agg.png | Bin 1187 -> 0 bytes ...ello_world_removed_hello_world_agg_mac.png | Bin 1114 -> 0 bytes ...o_world_removed_hello_world_skia_linux.png | Bin 1090 -> 0 bytes ...llo_world_removed_hello_world_skia_mac.png | Bin 1080 -> 0 bytes ...llo_world_removed_hello_world_skia_win.png | Bin 715 -> 0 bytes .../hello_world_removed_skia_linux.png | Bin 643 -> 0 bytes .../hello_world_removed_skia_mac.png | Bin 669 -> 0 bytes .../hello_world_removed_skia_win.png | Bin 383 -> 0 bytes ...split_streams_removed_hello_world.dump.txt | 8 + ..._split_streams_removed_hello_world_agg.png | Bin 1783 -> 0 bytes ...it_streams_removed_hello_world_agg_mac.png | Bin 1678 -> 0 bytes ...streams_removed_hello_world_skia_linux.png | Bin 1594 -> 0 bytes ...t_streams_removed_hello_world_skia_mac.png | Bin 1608 -> 0 bytes ...t_streams_removed_hello_world_skia_win.png | Bin 972 -> 0 bytes .../split_streams_removed_stream1.dump.txt | 22 ++ .../split_streams_removed_stream1_agg.png | Bin 12277 -> 0 bytes .../split_streams_removed_stream1_agg_mac.png | Bin 11220 -> 0 bytes ...it_streams_removed_stream1_agg_mac_x86.png | Bin 11170 -> 0 bytes ...lit_streams_removed_stream1_skia_linux.png | Bin 10987 -> 0 bytes ...split_streams_removed_stream1_skia_mac.png | Bin 10357 -> 0 bytes ...t_streams_removed_stream1_skia_mac_x86.png | Bin 10358 -> 0 bytes ...split_streams_removed_stream1_skia_win.png | Bin 5412 -> 0 bytes 37 files changed, 143 insertions(+), 174 deletions(-) create mode 100644 testing/resources/embedder_tests/blank_page_200x200.dump.txt create mode 100644 testing/resources/embedder_tests/encrypted.dump.txt delete mode 100644 testing/resources/embedder_tests/encrypted_agg.png delete mode 100644 testing/resources/embedder_tests/encrypted_agg_mac.png delete mode 100644 testing/resources/embedder_tests/encrypted_skia_linux.png delete mode 100644 testing/resources/embedder_tests/encrypted_skia_mac.png delete mode 100644 testing/resources/embedder_tests/encrypted_skia_win.png create mode 100644 testing/resources/embedder_tests/hello_world.dump.txt create mode 100644 testing/resources/embedder_tests/hello_world_removed.dump.txt delete mode 100644 testing/resources/embedder_tests/hello_world_removed_agg.png delete mode 100644 testing/resources/embedder_tests/hello_world_removed_agg_mac.png create mode 100644 testing/resources/embedder_tests/hello_world_removed_hello_world.dump.txt delete mode 100644 testing/resources/embedder_tests/hello_world_removed_hello_world_agg.png delete mode 100644 testing/resources/embedder_tests/hello_world_removed_hello_world_agg_mac.png delete mode 100644 testing/resources/embedder_tests/hello_world_removed_hello_world_skia_linux.png delete mode 100644 testing/resources/embedder_tests/hello_world_removed_hello_world_skia_mac.png delete mode 100644 testing/resources/embedder_tests/hello_world_removed_hello_world_skia_win.png delete mode 100644 testing/resources/embedder_tests/hello_world_removed_skia_linux.png delete mode 100644 testing/resources/embedder_tests/hello_world_removed_skia_mac.png delete mode 100644 testing/resources/embedder_tests/hello_world_removed_skia_win.png create mode 100644 testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world.dump.txt delete mode 100644 testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_agg.png delete mode 100644 testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_agg_mac.png delete mode 100644 testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_skia_linux.png delete mode 100644 testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_skia_mac.png delete mode 100644 testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_skia_win.png create mode 100644 testing/resources/embedder_tests/split_streams_removed_stream1.dump.txt delete mode 100644 testing/resources/embedder_tests/split_streams_removed_stream1_agg.png delete mode 100644 testing/resources/embedder_tests/split_streams_removed_stream1_agg_mac.png delete mode 100644 testing/resources/embedder_tests/split_streams_removed_stream1_agg_mac_x86.png delete mode 100644 testing/resources/embedder_tests/split_streams_removed_stream1_skia_linux.png delete mode 100644 testing/resources/embedder_tests/split_streams_removed_stream1_skia_mac.png delete mode 100644 testing/resources/embedder_tests/split_streams_removed_stream1_skia_mac_x86.png delete mode 100644 testing/resources/embedder_tests/split_streams_removed_stream1_skia_win.png diff --git a/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp b/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp index 3dfc2aec87..904bc46222 100644 --- a/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp +++ b/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp @@ -16,7 +16,6 @@ #include "public/fpdf_save.h" #include "public/fpdfview.h" #include "testing/embedder_test.h" -#include "testing/embedder_test_constants.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -89,18 +88,14 @@ class CPDFSecurityHandlerEmbedderTest : public EmbedderTest { private: void VerifyHelloWorldPage(FPDF_PAGE page) { ASSERT_TRUE(page); - - ScopedFPDFBitmap page_bitmap = RenderPage(page); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - pdfium::kHelloWorldPng); + std::string display_list = RenderPageToDisplayList(page); + CompareDisplayList(display_list, "hello_world"); } void VerifyModifiedHelloWorldPage(FPDF_PAGE page) { ASSERT_TRUE(page); - - ScopedFPDFBitmap page_bitmap = RenderPage(page); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - pdfium::kHelloWorldRemovedPng); + std::string display_list = RenderPageToDisplayList(page); + CompareDisplayList(display_list, "hello_world_removed"); } }; @@ -139,7 +134,6 @@ TEST_F(CPDFSecurityHandlerEmbedderTest, OwnerPassword) { } TEST_F(CPDFSecurityHandlerEmbedderTest, PasswordAfterGenerateSave) { - constexpr char kBasename[] = "encrypted"; { ASSERT_TRUE(OpenDocumentWithOptions("encrypted.pdf", "5678", LinearizeOption::kMustLinearize, @@ -151,8 +145,7 @@ TEST_F(CPDFSecurityHandlerEmbedderTest, PasswordAfterGenerateSave) { EXPECT_TRUE(FPDFPageObj_SetFillColor(red_rect, 255, 0, 0, 255)); EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect, FPDF_FILLMODE_ALTERNATE, 0)); FPDFPage_InsertObject(page.get(), red_rect); - ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap.get(), kBasename); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), "encrypted"); EXPECT_TRUE(FPDFPage_GenerateContent(page.get())); SetWholeFileAvailable(); EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); @@ -175,7 +168,7 @@ TEST_F(CPDFSecurityHandlerEmbedderTest, PasswordAfterGenerateSave) { ASSERT_TRUE(doc); ScopedSavedPage page = LoadScopedSavedPage(0); ASSERT_TRUE(page); - VerifySavedRenderingWithExpectationSuffix(page.get(), kBasename); + VerifySavedRenderingWithDisplayList(page.get(), "encrypted"); EXPECT_EQ(test.permissions, FPDF_GetDocPermissions(saved_document())); } } diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp index a513eb0b7f..574bed3f0b 100644 --- a/fpdfsdk/fpdf_edit_embeddertest.cpp +++ b/fpdfsdk/fpdf_edit_embeddertest.cpp @@ -8,8 +8,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -59,9 +61,6 @@ constexpr wchar_t kBottomText[] = L"I'm at the bottom of the page"; constexpr char kBottomTextPng[] = "bottom_text"; -constexpr char kHelloWorldRemovedHelloWorldPng[] = - "hello_world_removed_hello_world"; - constexpr wchar_t kLoadedFontText[] = L"I am testing my loaded font, WEE."; constexpr char kLoadedTextPng[] = "loaded_text"; @@ -1277,11 +1276,7 @@ TEST_F(FPDFEditEmbedderTest, RemoveTextObject) { ASSERT_TRUE(page); // Show what the original file looks like. - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - pdfium::kHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), "hello_world"); // Check the initial state of the text page as well. `text_page` must be freed // before calling FPDFPage_RemoveObject() below, so ASAN does not report @@ -1304,11 +1299,8 @@ TEST_F(FPDFEditEmbedderTest, RemoveTextObject) { ASSERT_EQ(1, FPDFPage_CountObjects(page.get())); // Verify the "Hello, world!" text is gone. - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - kHelloWorldRemovedHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "hello_world_removed_hello_world"); // Create a new text page, which has updated results. { @@ -1320,15 +1312,12 @@ TEST_F(FPDFEditEmbedderTest, RemoveTextObject) { // Verify the rendering again after calling FPDFPage_GenerateContent(). ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - kHelloWorldRemovedHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "hello_world_removed_hello_world"); // Save the document and verify it after reloading. ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - VerifySavedDocumentWithExpectationSuffix(kHelloWorldRemovedHelloWorldPng); + VerifySavedDocumentWithDisplayList("hello_world_removed_hello_world"); // Verify removed/renamed resources are no longer there. EXPECT_THAT(GetString(), Not(HasSubstr("/F1"))); @@ -1346,12 +1335,8 @@ TEST_F(FPDFEditEmbedderTest, ASSERT_TRUE(page2); // Show what the original file looks like. - { - ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get()); - CompareBitmapWithExpectationSuffix(page1_bitmap.get(), kHelloWorldPng); - ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get()); - CompareBitmapWithExpectationSuffix(page2_bitmap.get(), kHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page1.get()), "hello_world"); + CompareDisplayList(RenderPageToDisplayList(page2.get()), "hello_world"); // Get the "Hello, world!" text object from page 1 and remove it. ASSERT_EQ(2, FPDFPage_CountObjects(page1.get())); @@ -1364,33 +1349,27 @@ TEST_F(FPDFEditEmbedderTest, ASSERT_EQ(1, FPDFPage_CountObjects(page1.get())); // Verify the "Hello, world!" text is gone from page 1. - { - ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get()); - CompareBitmapWithExpectationSuffix(page1_bitmap.get(), - kHelloWorldRemovedHelloWorldPng); - ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get()); - CompareBitmapWithExpectationSuffix(page2_bitmap.get(), kHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page1.get()), + "hello_world_removed_hello_world"); + CompareDisplayList(RenderPageToDisplayList(page2.get()), "hello_world"); // Verify the rendering again after calling FPDFPage_GenerateContent(). ASSERT_TRUE(FPDFPage_GenerateContent(page1.get())); - { - ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get()); - CompareBitmapWithExpectationSuffix(page1_bitmap.get(), - kHelloWorldRemovedHelloWorldPng); - ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get()); - CompareBitmapWithExpectationSuffix(page2_bitmap.get(), kHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page1.get()), + "hello_world_removed_hello_world"); + CompareDisplayList(RenderPageToDisplayList(page2.get()), "hello_world"); // Save the document and verify it after reloading. ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); ScopedSavedDoc saved_document = OpenScopedSavedDocument(); ASSERT_TRUE(saved_document); ScopedSavedPage saved_page1 = LoadScopedSavedPage(0); - VerifySavedRenderingWithExpectationSuffix(saved_page1.get(), - kHelloWorldRemovedHelloWorldPng); + ASSERT_TRUE(saved_page1); + VerifySavedRenderingWithDisplayList(saved_page1.get(), + "hello_world_removed_hello_world"); ScopedSavedPage saved_page2 = LoadScopedSavedPage(1); - VerifySavedRenderingWithExpectationSuffix(saved_page2.get(), kHelloWorldPng); + ASSERT_TRUE(saved_page2); + VerifySavedRenderingWithDisplayList(saved_page2.get(), "hello_world"); std::vector split_saved_data = StringSplit(GetString(), '\n'); // Verify removed/renamed resources are in the save PDF the correct number of // times. @@ -1409,12 +1388,8 @@ TEST_F(FPDFEditEmbedderTest, ASSERT_TRUE(page2); // Show what the original file looks like. - { - ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get()); - CompareBitmapWithExpectationSuffix(page1_bitmap.get(), kHelloWorldPng); - ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get()); - CompareBitmapWithExpectationSuffix(page2_bitmap.get(), kHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page1.get()), "hello_world"); + CompareDisplayList(RenderPageToDisplayList(page2.get()), "hello_world"); // Get the "Hello, world!" text object from page 1 and remove it. ASSERT_EQ(2, FPDFPage_CountObjects(page1.get())); @@ -1427,33 +1402,27 @@ TEST_F(FPDFEditEmbedderTest, ASSERT_EQ(1, FPDFPage_CountObjects(page1.get())); // Verify the "Hello, world!" text is gone from page 1. - { - ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get()); - CompareBitmapWithExpectationSuffix(page1_bitmap.get(), - kHelloWorldRemovedHelloWorldPng); - ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get()); - CompareBitmapWithExpectationSuffix(page2_bitmap.get(), kHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page1.get()), + "hello_world_removed_hello_world"); + CompareDisplayList(RenderPageToDisplayList(page2.get()), "hello_world"); // Verify the rendering again after calling FPDFPage_GenerateContent(). ASSERT_TRUE(FPDFPage_GenerateContent(page1.get())); - { - ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get()); - CompareBitmapWithExpectationSuffix(page1_bitmap.get(), - kHelloWorldRemovedHelloWorldPng); - ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get()); - CompareBitmapWithExpectationSuffix(page2_bitmap.get(), kHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page1.get()), + "hello_world_removed_hello_world"); + CompareDisplayList(RenderPageToDisplayList(page2.get()), "hello_world"); // Save the document and verify it after reloading. ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); ScopedSavedDoc saved_document = OpenScopedSavedDocument(); ASSERT_TRUE(saved_document); ScopedSavedPage saved_page1 = LoadScopedSavedPage(0); - VerifySavedRenderingWithExpectationSuffix(saved_page1.get(), - kHelloWorldRemovedHelloWorldPng); + ASSERT_TRUE(saved_page1); + VerifySavedRenderingWithDisplayList(saved_page1.get(), + "hello_world_removed_hello_world"); ScopedSavedPage saved_page2 = LoadScopedSavedPage(1); - VerifySavedRenderingWithExpectationSuffix(saved_page2.get(), kHelloWorldPng); + ASSERT_TRUE(saved_page2); + VerifySavedRenderingWithDisplayList(saved_page2.get(), "hello_world"); } TEST_F(FPDFEditEmbedderTest, RemoveTextObjectWithTwoPagesSharingResourcesDict) { @@ -1465,12 +1434,8 @@ TEST_F(FPDFEditEmbedderTest, RemoveTextObjectWithTwoPagesSharingResourcesDict) { ASSERT_TRUE(page2); // Show what the original file looks like. - { - ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get()); - CompareBitmapWithExpectationSuffix(page1_bitmap.get(), kHelloWorldPng); - ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get()); - CompareBitmapWithExpectationSuffix(page2_bitmap.get(), kHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page1.get()), "hello_world"); + CompareDisplayList(RenderPageToDisplayList(page2.get()), "hello_world"); // Get the "Hello, world!" text object from page 1 and remove it. ASSERT_EQ(2, FPDFPage_CountObjects(page1.get())); @@ -1483,33 +1448,27 @@ TEST_F(FPDFEditEmbedderTest, RemoveTextObjectWithTwoPagesSharingResourcesDict) { ASSERT_EQ(1, FPDFPage_CountObjects(page1.get())); // Verify the "Hello, world!" text is gone from page 1 - { - ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get()); - CompareBitmapWithExpectationSuffix(page1_bitmap.get(), - kHelloWorldRemovedHelloWorldPng); - ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get()); - CompareBitmapWithExpectationSuffix(page2_bitmap.get(), kHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page1.get()), + "hello_world_removed_hello_world"); + CompareDisplayList(RenderPageToDisplayList(page2.get()), "hello_world"); // Verify the rendering again after calling FPDFPage_GenerateContent(). ASSERT_TRUE(FPDFPage_GenerateContent(page1.get())); - { - ScopedFPDFBitmap page1_bitmap = RenderPage(page1.get()); - CompareBitmapWithExpectationSuffix(page1_bitmap.get(), - kHelloWorldRemovedHelloWorldPng); - ScopedFPDFBitmap page2_bitmap = RenderPage(page2.get()); - CompareBitmapWithExpectationSuffix(page2_bitmap.get(), kHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page1.get()), + "hello_world_removed_hello_world"); + CompareDisplayList(RenderPageToDisplayList(page2.get()), "hello_world"); // Save the document and verify it after reloading. ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); ScopedSavedDoc saved_document = OpenScopedSavedDocument(); ASSERT_TRUE(saved_document); ScopedSavedPage saved_page1 = LoadScopedSavedPage(0); - VerifySavedRenderingWithExpectationSuffix(saved_page1.get(), - kHelloWorldRemovedHelloWorldPng); + ASSERT_TRUE(saved_page1); + VerifySavedRenderingWithDisplayList(saved_page1.get(), + "hello_world_removed_hello_world"); ScopedSavedPage saved_page2 = LoadScopedSavedPage(1); - VerifySavedRenderingWithExpectationSuffix(saved_page2.get(), kHelloWorldPng); + ASSERT_TRUE(saved_page2); + VerifySavedRenderingWithDisplayList(saved_page2.get(), "hello_world"); } void CheckMarkCounts(FPDF_PAGE page, @@ -1941,14 +1900,9 @@ TEST_F(FPDFEditEmbedderTest, RemoveExistingPageObjectSplitStreamsNotLonely) { } // Verify the "Hello, world!" text is gone. - static constexpr char kHelloWorldSplitStreamsRemovedHelloWorldPng[] = - "hello_world_split_streams_removed_hello_world"; ASSERT_EQ(2, FPDFPage_CountObjects(page.get())); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix( - page_bitmap.get(), kHelloWorldSplitStreamsRemovedHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "hello_world_split_streams_removed_hello_world"); // Save the file EXPECT_TRUE(FPDFPage_GenerateContent(page.get())); @@ -1961,11 +1915,8 @@ TEST_F(FPDFEditEmbedderTest, RemoveExistingPageObjectSplitStreamsNotLonely) { ASSERT_TRUE(saved_page); EXPECT_EQ(2, FPDFPage_CountObjects(saved_page.get())); - { - ScopedFPDFBitmap page_bitmap = RenderPage(saved_page.get()); - CompareBitmapWithExpectationSuffix( - page_bitmap.get(), kHelloWorldSplitStreamsRemovedHelloWorldPng); - } + VerifySavedRenderingWithDisplayList( + saved_page.get(), "hello_world_split_streams_removed_hello_world"); } TEST_F(FPDFEditEmbedderTest, RemoveExistingPageObjectSplitStreamsLonely) { @@ -1985,10 +1936,7 @@ TEST_F(FPDFEditEmbedderTest, RemoveExistingPageObjectSplitStreamsLonely) { // Verify the "Greetings, world!" text is gone. ASSERT_EQ(2, FPDFPage_CountObjects(page.get())); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), kHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), "hello_world"); // Save the file EXPECT_TRUE(FPDFPage_GenerateContent(page.get())); @@ -2001,10 +1949,7 @@ TEST_F(FPDFEditEmbedderTest, RemoveExistingPageObjectSplitStreamsLonely) { ASSERT_TRUE(saved_page); EXPECT_EQ(2, FPDFPage_CountObjects(saved_page.get())); - { - ScopedFPDFBitmap page_bitmap = RenderPage(saved_page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), kHelloWorldPng); - } + VerifySavedRenderingWithDisplayList(saved_page.get(), "hello_world"); } TEST_F(FPDFEditEmbedderTest, GetContentStream) { @@ -2092,13 +2037,8 @@ TEST_F(FPDFEditEmbedderTest, RemoveAllFromStream) { } } - static constexpr char kSplitStreamsRemovedStream1Png[] = - "split_streams_removed_stream1"; - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - kSplitStreamsRemovedStream1Png); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "split_streams_removed_stream1"); // Save the file EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); @@ -2125,11 +2065,8 @@ TEST_F(FPDFEditEmbedderTest, RemoveAllFromStream) { } } - { - ScopedFPDFBitmap page_bitmap = RenderPage(saved_page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - kSplitStreamsRemovedStream1Png); - } + VerifySavedRenderingWithDisplayList(saved_page.get(), + "split_streams_removed_stream1"); } TEST_F(FPDFEditEmbedderTest, RemoveAllFromSingleStream) { @@ -2161,10 +2098,7 @@ TEST_F(FPDFEditEmbedderTest, RemoveAllFromSingleStream) { ASSERT_EQ(0, FPDFPage_CountObjects(page.get())); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmap(page_bitmap.get(), kBlankPage200x200Png); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), "blank_page_200x200"); // Save the file EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); @@ -2176,10 +2110,7 @@ TEST_F(FPDFEditEmbedderTest, RemoveAllFromSingleStream) { ASSERT_TRUE(saved_page); EXPECT_EQ(0, FPDFPage_CountObjects(saved_page.get())); - { - ScopedFPDFBitmap page_bitmap = RenderPage(saved_page.get()); - CompareBitmap(page_bitmap.get(), kBlankPage200x200Png); - } + VerifySavedRenderingWithDisplayList(saved_page.get(), "blank_page_200x200"); } TEST_F(FPDFEditEmbedderTest, RemoveFirstFromSingleStream) { @@ -2219,11 +2150,8 @@ TEST_F(FPDFEditEmbedderTest, RemoveFirstFromSingleStream) { cpdf_page_object = CPDFPageObjectFromFPDFPageObject(page_object); ASSERT_EQ(0, cpdf_page_object->GetContentStream()); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - kHelloWorldRemovedHelloWorldPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "hello_world_removed_hello_world"); // Save the file EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); @@ -2239,11 +2167,8 @@ TEST_F(FPDFEditEmbedderTest, RemoveFirstFromSingleStream) { ASSERT_TRUE(page_object); cpdf_page_object = CPDFPageObjectFromFPDFPageObject(page_object); ASSERT_EQ(0, cpdf_page_object->GetContentStream()); - { - ScopedFPDFBitmap page_bitmap = RenderPage(saved_page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - kHelloWorldRemovedHelloWorldPng); - } + VerifySavedRenderingWithDisplayList(saved_page.get(), + "hello_world_removed_hello_world"); } TEST_F(FPDFEditEmbedderTest, RemoveLastFromSingleStream) { @@ -2283,12 +2208,8 @@ TEST_F(FPDFEditEmbedderTest, RemoveLastFromSingleStream) { cpdf_page_object = CPDFPageObjectFromFPDFPageObject(page_object); ASSERT_EQ(0, cpdf_page_object->GetContentStream()); - using pdfium::kHelloWorldRemovedPng; - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - kHelloWorldRemovedPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "hello_world_removed"); // Save the file EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); @@ -2304,11 +2225,7 @@ TEST_F(FPDFEditEmbedderTest, RemoveLastFromSingleStream) { ASSERT_TRUE(page_object); cpdf_page_object = CPDFPageObjectFromFPDFPageObject(page_object); ASSERT_EQ(0, cpdf_page_object->GetContentStream()); - { - ScopedFPDFBitmap page_bitmap = RenderPage(saved_page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - kHelloWorldRemovedPng); - } + VerifySavedRenderingWithDisplayList(saved_page.get(), "hello_world_removed"); } TEST_F(FPDFEditEmbedderTest, RemoveAllFromMultipleStreams) { @@ -2338,10 +2255,7 @@ TEST_F(FPDFEditEmbedderTest, RemoveAllFromMultipleStreams) { ASSERT_EQ(0, FPDFPage_CountObjects(page.get())); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmap(page_bitmap.get(), kBlankPage200x200Png); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), "blank_page_200x200"); // Save the file EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); @@ -2353,10 +2267,7 @@ TEST_F(FPDFEditEmbedderTest, RemoveAllFromMultipleStreams) { ASSERT_TRUE(saved_page); EXPECT_EQ(0, FPDFPage_CountObjects(saved_page.get())); - { - ScopedFPDFBitmap page_bitmap = RenderPage(saved_page.get()); - CompareBitmap(page_bitmap.get(), kBlankPage200x200Png); - } + VerifySavedRenderingWithDisplayList(saved_page.get(), "blank_page_200x200"); } TEST_F(FPDFEditEmbedderTest, InsertPageObjectAndSave) { diff --git a/testing/embedder_test_constants.h b/testing/embedder_test_constants.h index c6f84e9bf7..d1c68d4a1d 100644 --- a/testing/embedder_test_constants.h +++ b/testing/embedder_test_constants.h @@ -23,10 +23,6 @@ inline constexpr char kBug890322Png[] = "bug_890322"; // Expectation file basename for rendering hello_world.pdf or bug_455199.pdf. inline constexpr char kHelloWorldPng[] = "hello_world"; -// Expectation file basename for rendering hello_world.pdf after removing -// "Goodbye, world!". -inline constexpr char kHelloWorldRemovedPng[] = "hello_world_removed"; - // Expectation file basename for rendering many_rectangles.pdf. inline constexpr char kManyRectanglesPng[] = "many_rectangles"; diff --git a/testing/resources/embedder_tests/blank_page_200x200.dump.txt b/testing/resources/embedder_tests/blank_page_200x200.dump.txt new file mode 100644 index 0000000000..246c185f58 --- /dev/null +++ b/testing/resources/embedder_tests/blank_page_200x200.dump.txt @@ -0,0 +1,6 @@ +SaveState +SetBaseClip [0,0,200,200] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,200.0000) line(0.0000,0.0000) line(200.0000,0.0000) line(200.0000,200.0000) line(0.0000,200.0000,close)] +SaveState +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/encrypted.dump.txt b/testing/resources/embedder_tests/encrypted.dump.txt new file mode 100644 index 0000000000..aab3297c9c --- /dev/null +++ b/testing/resources/embedder_tests/encrypted.dump.txt @@ -0,0 +1,11 @@ +SaveState +SetBaseClip [0,0,612,792] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,792.0000) line(0.0000,0.0000) line(612.0000,0.0000) line(612.0000,792.0000) line(0.0000,792.0000,close)] +SaveState +DrawDeviceText font="Tinos" size=1.0000 color=0xff000000 matrix=[9.0000,0.0000,0.0000,-9.0000,5.0000,787.0000] glyphs=[(idx=73,u=U+0066,origin=(0.0000,0.0000)) (idx=76,u=U+0069,origin=(0.3330,0.0000)) (idx=79,u=U+006C,origin=(0.6110,0.0000)) (idx=72,u=U+0065,origin=(0.8890,0.0000)) (idx=29,u=U+003A,origin=(1.3330,0.0000)) (idx=18,u=U+002F,origin=(1.6110,0.0000)) (idx=18,u=U+002F,origin=(1.8890,0.0000)) (idx=18,u=U+002F,origin=(2.1670,0.0000)) (idx=38,u=U+0043,origin=(2.4450,0.0000)) (idx=95,u=U+007C,origin=(3.1120,0.0000)) (idx=18,u=U+002F,origin=(3.3120,0.0000)) (idx=56,u=U+0055,origin=(3.5900,0.0000)) (idx=86,u=U+0073,origin=(4.3120,0.0000)) (idx=72,u=U+0065,origin=(4.7010,0.0000)) (idx=85,u=U+0072,origin=(5.1450,0.0000)) (idx=86,u=U+0073,origin=(5.4780,0.0000)) (idx=18,u=U+002F,origin=(5.8670,0.0000)) (idx=56,u=U+0055,origin=(6.1450,0.0000)) (idx=86,u=U+0073,origin=(6.8670,0.0000)) (idx=72,u=U+0065,origin=(7.2560,0.0000)) (idx=85,u=U+0072,origin=(7.7000,0.0000)) (idx=18,u=U+002F,origin=(8.0330,0.0000)) (idx=39,u=U+0044,origin=(8.3110,0.0000)) (idx=72,u=U+0065,origin=(9.0330,0.0000)) (idx=86,u=U+0073,origin=(9.4770,0.0000)) (idx=78,u=U+006B,origin=(9.8660,0.0000)) (idx=87,u=U+0074,origin=(10.3660,0.0000)) (idx=82,u=U+006F,origin=(10.6440,0.0000)) (idx=83,u=U+0070,origin=(11.1440,0.0000)) (idx=18,u=U+002F,origin=(11.6440,0.0000)) (idx=20,u=U+0031,origin=(11.9220,0.0000)) (idx=17,u=U+002E,origin=(12.4220,0.0000)) (idx=87,u=U+0074,origin=(12.6720,0.0000)) (idx=91,u=U+0078,origin=(12.9500,0.0000)) (idx=87,u=U+0074,origin=(13.4500,0.0000))] +DrawDeviceText font="Tinos" size=1.0000 color=0xff000000 matrix=[9.0000,0.0000,0.0000,-9.0000,128.5430,787.0000] glyphs=[(idx=62,u=U+005B,origin=(0.0000,0.0000)) (idx=24,u=U+0035,origin=(0.3330,0.0000)) (idx=18,u=U+002F,origin=(0.8330,0.0000)) (idx=21,u=U+0032,origin=(1.1110,0.0000)) (idx=20,u=U+0031,origin=(1.6110,0.0000)) (idx=18,u=U+002F,origin=(2.1110,0.0000)) (idx=21,u=U+0032,origin=(2.3890,0.0000)) (idx=19,u=U+0030,origin=(2.8890,0.0000)) (idx=20,u=U+0031,origin=(3.3890,0.0000)) (idx=25,u=U+0036,origin=(3.8890,0.0000)) (idx=3,u=U+0020,origin=(4.3890,0.0000)) (idx=25,u=U+0036,origin=(4.6390,0.0000)) (idx=29,u=U+003A,origin=(5.1390,0.0000)) (idx=21,u=U+0032,origin=(5.4170,0.0000)) (idx=23,u=U+0034,origin=(5.9170,0.0000)) (idx=29,u=U+003A,origin=(6.4170,0.0000)) (idx=19,u=U+0030,origin=(6.6950,0.0000)) (idx=19,u=U+0030,origin=(7.1950,0.0000)) (idx=3,u=U+0020,origin=(7.6950,0.0000)) (idx=36,u=U+0041,origin=(7.9450,0.0000)) (idx=48,u=U+004D,origin=(8.6670,0.0000)) (idx=64,u=U+005D,origin=(9.5560,0.0000))] +FillRect [10,26,602,756] color=0xffffffff +DrawDeviceText font="Tinos" size=1.0000 color=0xff000000 matrix=[12.0000,0.0000,0.0000,-12.0000,16.0000,42.7500] glyphs=[(idx=87,u=U+0074,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(0.2780,0.0000)) (idx=86,u=U+0073,origin=(0.7220,0.0000)) (idx=87,u=U+0074,origin=(1.1110,0.0000))] +FillRect [10,762,30,782] color=0xffff0000 +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/encrypted_agg.png b/testing/resources/embedder_tests/encrypted_agg.png deleted file mode 100644 index 300f7102bb31714c09f94d4859bda1957b77ca5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3498 zcmeH~XHXMb7RTe$wIQqSQ&>dA@~|L9ilQQ*hyv0if|L+K34|6PU;>f=B0W+>s!>2% z=)IQ&3nT;x-C)2FMCpV8K?os`hweUS_v5}dv-5UlKi!%Cf6kqAf9KpY_eS0|)E3@* zWG?^!5Z2Yv0s;U(K>>j6f8V`*O97e-J=zlV@9LY}I(_=ItgNhpf`X!=qLPx5va<5U zix)3lx}>6_qNb*%p`mg8`t=((ZfI(1-oAZXTU%R4M@Lsz_s*R=dU|^L`uYY221Z6k z#>U1#An@M3dnP6(rlzL%@835wGcz|gx3I9Vw6p|)Kvq^(U@+L)+8P3Z*x1>6!`x3~9$ z2M>@)BnpM{@$vEX^?ms8p`V{08jZ$aF#i7j0RaJlfq{=6Jqij6di?ltaBy%)NJwaC zXjoWSczAe3L_}m{Bo>Q(^5jWWR8(|ybWBW4Y;5e)r%&VJ;+{Qw79Ss&F)=YYIXN{oH9b8&Gcz+gJ3BWw$6~SO=jYjM z_QJx#;^N}c(h`TmSzccL`t|F|%F62MDwoS$TU+DtciFK<(r0y!H#HyL5q%uKJ!0EW2ZL{A zl2zl9lkDzB?ha8ts}R!kwAT7>-h+)SPApQTycPH0YX2T31RoPXxh9WJo(q7<*ZSNNXqLgc2#U>cmQo+iIXK72wbxvLl$EfjZHb)~r<Qg95koqh1U2HP${^3}t}k7$$*} z;4QMBpFMKbms@&(f$Q4;5y#GR_Jotop{YVKGOCw=P*o9@L26_>q-l~cwNPmQ+2ay2 zjcd>O48ajH*CFMdS9po`(sBfaLUxCea4gvMr6i_tb`X3qr%3 zLZ*YTyrs#kxu#aiWuJ@_W*B7#qR8#IPx*-%w_;W_$GJpqDwzZLkW1k9B>8h3H<7k$Lh=M< z`~GZh%3Teq7#XF&iRr~eS9P2Q2Wne`cu1#Xe4I~bOA0Pq#4t68XS&XU4iFknikYdE zA-v5Z9J@iQT}-q4zvyis$8VXQaU3*oB3!d2_0A>qQw)}SY91OBv&*t!H*M?NNF%95 z?v{cEH8mrvRO2c;OF1F~>H=isZ1npG-(JbZ@-lGl>QzPO=;f~dRV%%fy$jP^kweeg z45MPnv86GqGARvG3GRdyPY~mjs)_?X4a*UWl1bYKV+Uw#_TEjQ`XH%v3CSa-N!k>z zJ`j6m2s`F9Tmj{ibCslAH8)kzeeqo_;UvB3Vpgl^35;S!@%&(a>;%3=65rd=A;Lte zHGf*zSO<1LaoeYT3B3TxlUJ90H?d|s)tGV>h|6Dh0M#`}CCj0e>5Dwx)3uK6XTprm z)V}(q!VLQi(Uj{r-yWHs;10*seeKImeX$dN>3ox!%A`73d|nvsFtPV!EC&hj|A@eE{725W!) z+hB^kAfk*mBRd|7Rz5qSE{26 zQL+&}m<7#G)UW9D{G;mr#mez%8t$L5nMuBU+ooK+jW#8L`WML}jKgA*M5Q%)UQ4>l zgE-4-R!b~6`=NSf$!L`&t#jD1yST`&qCwevbbWPW%(tm25bdwL+O@v7Zp{YL+Fgo;tg>B-Dxy zJ0`0P%MxeVP7dKQOi?2-zskigJ(hfkKVSN}yu{UI8s+CGe5WW=w{(91Sb{4fzO$nC z7^H;>1T~I{y2gYFz_4^LIN1ey>as7&WaRAnaJ||o>Z)n_l;noSEGcLeJX~u0?Qu#{ c8PVA05_|AS$qsJQ)*lR@d&^L(MAPQ+uacxRWdHyG diff --git a/testing/resources/embedder_tests/encrypted_agg_mac.png b/testing/resources/embedder_tests/encrypted_agg_mac.png deleted file mode 100644 index d94e6f21b8111c2a658289dacfcbf33c3220a8f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3555 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 PBY+;r7+84K@!mfG!aU^U diff --git a/testing/resources/embedder_tests/encrypted_skia_mac.png b/testing/resources/embedder_tests/encrypted_skia_mac.png deleted file mode 100644 index 496bb4bf990aec5cef4dd100e65afdaa821997ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3318 zcmeHKYcLz=8cw&f?M|z;-EQ44TUxr5PGgiVsh(m;-KuEgR!Y=eH>*mKXzQq?h`Kds zanObaQAq_AvPBwqLL!2QiXaG5f{4pev+bNSb7uDJoSB{TV}HFf&-cBT=e^DMp|03l z9XgL1pvN+0swmzzS+BjT!kFG4*=|0xMJ&U`RT%;LvnI*Dk>@(8X8(! zS~@y9`uh4nAkfgz(Ae16#KZ&y0$sd#@zSMBmX?-QR#spz*v7`j&d$!k!NJkd(aFil z#l_{?wQCRv#Ldmk!^6YV)6>h#%iG)A$H&Ll*Z0<~TLA$9fq{WRK|vuQA)%q6VPRn~ z7%V(IJR&0E?%lhQk&#hRQTOiMi;j+tjg5uF;RpmGE-vo={re9dJb3u!|#)2B}{7)*9{ zc1})CZf@?gXV0ELf1a0@m!F?sP*6}C-XFJEG@*piZx($Z2K4p&xI zR$g9SQBi@%<0~sGU%!4$AP|T|;+r>bNF-8CO-)^0U44B$nM`hIXrNFi@7}#@YHDh3 zZfgHm_r2(@2f7TTjoHYWe5Pgz-J*4wbB8gDELLc53YWg8!uP zu{{ou1gHD0-zp+y(vAbaRn*wKBP{l5m_v~=7LQsl?ufJpJIA~DjxdM*0Q?Q#5#K6q zY^PO7L}UC}`y=6MuGk{}09D@Ip1R+zCnUCVoK^6XRc8cr@4;e-MB?oy608=R=`_L~ zM}3!;S2-=f*Y>)x4Yh#zSD^5N`}XboMG{$tK_+V-Vdu0f{P>coY^3w?nC2(T?9H$3 z;%^V&L-b5JBO{6_)eF0Z&qkOPMH#VcO$_VzgsXhw@Fmt=4qsy3#XnQr>pGkd?+Dt{I453RD_OXsIS{`2PiOYsnnX`A&j z+TZ+}_ubw5Ibd_>&RX6eYt+L}6`YZ0LtB^&MORMMlSb}rRng-qoHaqNfabp*vjB2i zAEWC|XnNV^W7SfUoD5;BMxNG}TREUiLj4D$0;E0-JIsuVIFp z!K!t0f?B8Zb;gJ1PN&GH(wInPLs;bay7+dbr5Hn}OjtihzwgjYDPgsQm-NdAlqn(y z2?0MemX0bp@`k#Jt!NijHAs%d0GGs*H4ml7XrT&MI~PbLX0vrszN;a2?xWLWW-oUc zY~Jxf9IEMuHREo;mDp8O!CEY#htvqKmnt`2c*Ews{7{+J~j zp0%G?#rFoDucZXTTL#Q3P_~%X$(vAKhtG+Wxr70`vhk;F0! zuNM(bHj!{&>BGb-@eTfzi7YZi&5Crg0hu7`o>p;CJIpFs<%8tC9z#Tq6D;cV1KiOz zW+Pj{7n47uZvY>M{z%BH?}xqZAYQn#}DxueMpK ztzHUtZY$IVY6fcWU(G6VcQdUA)^XjAP~yrUr|0LBhIOyGu+VZvlJ@Ie&B4CnpMM$V z0?!TfD!XeN>63K{5(PF2*S|k#U(mMcAVVT5>EJ5rkZ306js%lH0N3V2kR%7JU=Q)exbX{i5z>Ohg z>U=`X?P@iUYutnYHN&zWD8Qk7c=^@lLRdu+e!jvz&SP+sRTzbE^yI`xo~s_UrcoQw zVs$MFACI}7IzJduOTg>b?YFt0FF(;kW<=w%IppK0r7RaG**K@An>;Q>P+Nn8IYXD0 zVhB0gU!92SqX^!2zVde0ex#!2AlBk y7me#3ep6=-Pfl(XWGR!UhqjV;UyTUS)?OxmhUgb}n6vYN0e~&-E%2ATAN~_#&eZ<^ diff --git a/testing/resources/embedder_tests/encrypted_skia_win.png b/testing/resources/embedder_tests/encrypted_skia_win.png deleted file mode 100644 index 0c12000d1ad6105d55623491a3a2bb25cb524d23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2332 zcmds3YfPGF6lR(>otvp!(ylJ8ZVH-Jr;SEetJG~p5pQiBwnZmy>1T<;G}Sq)i0+cv zwOSdF)+?B$m_|j29~Y$x#C4O8sxTGsf)*PubRrn1fX%n*khP{+mUP*&HR-P>?>Xnq z^PH3OK6$U4O2vA5yzYTOAUtsim^1{!4L~5=5A1PwM$*o`^tlt_P9@{xoERP+o|KeC zBog!U^Jz3%b#--peLa`U?dt04>FMd~>+A3DhahNZXlQI~OsCW7^?IYxxU{sizP`SN zKx}Po6%If$1Y!>phj|ZwY05G&Q)__seSJFq@cz9Y+`(4?b~rXKL~EajhcEo(`RTV} z>p3@6`^NnTq!-Jn@s&P(X!+4dFDcB?e;@YU9U(FZiDW*`9yt}WUQ*VJkZc=cH zW-O-b#l2-@l653cR%A!Q4`=}8x8m}A8q!`Chy!4QB^z$hbR8lqTN9rEA{}m2wIqY|+Be(J;q6 zd!gp6#~@E64J=+3C`U)r)?$qLmBY>Egki10G@CHG(#JtHz?25T_dYj$RUbNRiOgP- zf-L7(w3Vf(=Wgq{R+9ZKF!Uh79Kl>}Alb{CfP%4Gg)xr2^js;m_Z~srjXTr1WVN)* zFPymn;F5G4gkpoMzb)50`L+Own}I5_@6pE)Nh8RP391_J`w0!y=tAJSk5BhdwzuP@Z)c zU05J68H^#83|0qe87G0^Zkexwl@4CR4}|-{R~f^~(in9lU(D~IM^gvbHALD_Z0$Tn zr{Sd&$ZBPjWYZKqNCm}H5}-3mQqc*o_O&QSUmKh+1EuG0`x;H zd5*62dUSX9C%4m7uYH?JMHa yJKeMyKD{!tPH|*2)W3;7_*wP#Ut%_EYgZhfg>IAjmN~yU2wYq$hX4LYU;YlL<-5ZG diff --git a/testing/resources/embedder_tests/hello_world.dump.txt b/testing/resources/embedder_tests/hello_world.dump.txt new file mode 100644 index 0000000000..2a03794224 --- /dev/null +++ b/testing/resources/embedder_tests/hello_world.dump.txt @@ -0,0 +1,8 @@ +SaveState +SetBaseClip [0,0,200,200] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,200.0000) line(0.0000,0.0000) line(200.0000,0.0000) line(200.0000,200.0000) line(0.0000,200.0000,close)] +SaveState +DrawDeviceText font="Tinos" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,20.0000,150.0000] glyphs=[(idx=43,u=U+0048,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(8.6640,0.0000)) (idx=79,u=U+006C,origin=(13.9920,0.0000)) (idx=79,u=U+006C,origin=(17.3280,0.0000)) (idx=82,u=U+006F,origin=(20.6640,0.0000)) (idx=15,u=U+002C,origin=(26.6640,0.0000)) (idx=3,u=U+0020,origin=(29.6640,0.0000)) (idx=90,u=U+0077,origin=(32.6640,0.0000)) (idx=82,u=U+006F,origin=(41.3280,0.0000)) (idx=85,u=U+0072,origin=(47.3280,0.0000)) (idx=79,u=U+006C,origin=(51.3240,0.0000)) (idx=71,u=U+0064,origin=(54.6600,0.0000)) (idx=4,u=U+0021,origin=(60.6600,0.0000))] +DrawDeviceText font="Arimo" size=16.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,20.0000,100.0000] glyphs=[(idx=42,u=U+0047,origin=(0.0000,0.0000)) (idx=82,u=U+006F,origin=(12.4480,0.0000)) (idx=82,u=U+006F,origin=(21.3440,0.0000)) (idx=71,u=U+0064,origin=(30.2400,0.0000)) (idx=69,u=U+0062,origin=(39.1360,0.0000)) (idx=92,u=U+0079,origin=(48.0320,0.0000)) (idx=72,u=U+0065,origin=(56.0320,0.0000)) (idx=15,u=U+002C,origin=(64.9280,0.0000)) (idx=3,u=U+0020,origin=(69.3760,0.0000)) (idx=90,u=U+0077,origin=(73.8240,0.0000)) (idx=82,u=U+006F,origin=(85.3760,0.0000)) (idx=85,u=U+0072,origin=(94.2720,0.0000)) (idx=79,u=U+006C,origin=(99.6000,0.0000)) (idx=71,u=U+0064,origin=(103.1520,0.0000)) (idx=4,u=U+0021,origin=(112.0480,0.0000))] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/hello_world_removed.dump.txt b/testing/resources/embedder_tests/hello_world_removed.dump.txt new file mode 100644 index 0000000000..7748e58874 --- /dev/null +++ b/testing/resources/embedder_tests/hello_world_removed.dump.txt @@ -0,0 +1,7 @@ +SaveState +SetBaseClip [0,0,200,200] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,200.0000) line(0.0000,0.0000) line(200.0000,0.0000) line(200.0000,200.0000) line(0.0000,200.0000,close)] +SaveState +DrawDeviceText font="Tinos" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,20.0000,150.0000] glyphs=[(idx=43,u=U+0048,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(8.6640,0.0000)) (idx=79,u=U+006C,origin=(13.9920,0.0000)) (idx=79,u=U+006C,origin=(17.3280,0.0000)) (idx=82,u=U+006F,origin=(20.6640,0.0000)) (idx=15,u=U+002C,origin=(26.6640,0.0000)) (idx=3,u=U+0020,origin=(29.6640,0.0000)) (idx=90,u=U+0077,origin=(32.6640,0.0000)) (idx=82,u=U+006F,origin=(41.3280,0.0000)) (idx=85,u=U+0072,origin=(47.3280,0.0000)) (idx=79,u=U+006C,origin=(51.3240,0.0000)) (idx=71,u=U+0064,origin=(54.6600,0.0000)) (idx=4,u=U+0021,origin=(60.6600,0.0000))] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/hello_world_removed_agg.png b/testing/resources/embedder_tests/hello_world_removed_agg.png deleted file mode 100644 index 7d2eab4ae579f7670e32d36ca50f452fd158de01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 729 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCU|Qhm;uunK>+Q9(*}{%8$3Ffu zY*Gjc*!XJUk*y}zBqmPt+S>8LamiWN%gyfvlfN$bvVi4_z-+0l3$?Z_5pYtJUd5KwSvU|?io zp*!Obm%9i{N z=biTDNW0$gpVzj%IdCeIJFerUOXkYC)l20=7ygTij=gZ|*sYM@mGeLAr=@*erS*Sm q_LK7Y8Y`_+??n-t3O>aU~2GmaSW-r z_4b;-$K^zs;~$@fY)C6H{@GjP;(GK~e2d5zcBfAZS_D`p{*~PQ=ZKJul1oWPZlI!T zX=X0VB|{}ev62@C;x02dj83quRaM)Op;nw*XZ1$BQo7_<== z8HWZ2MkW>x0R_4=*c(z6T$h97jkCH=Nfbi8wabO z7qu?0wl1m7-tO)e_OQ{OxuW=kp9L)9|LA9ZUY54YQ4vtcj4`weWQM(remcDI0#Z zGc7Ah{O!1G?)rN9vgDw<)4%-bR(bhh)z5FMJXODW@_KSlDpwUTm@2v9^4HyaOa9)w zd%Nh@;`L@ig+Gn@XZvkk%2g^mX$kw=s+$_3R?)Nd#SV+scI~K{xvy>8-)g&~TF>A9 zP&lXaGF|mGPytdU*GQ9JKz4DUCqPKbro;t zz5iUJ-5OwKjSQ9F|byi2Z6iV{qy?fc!O_FvSaa8`^a^;MKTxF{vCrR+@g^Brdo zD5{petC6$nc5tIy>ov}J|gpd&)F9pg$kGI&(8V#L(aUt zLt)$XHy2ro?EWzawwtB$2#0!?E_!io|IrhI@b*6i^xCqF4e9vOCwEkZF@7BMn!jH3U04Up zX3Q39>rg0K<;JUUUv#uZHr}kwR)CtCambfTe{+%~?8?_*<591;+8kx##Oh2>G?jzXK5Ew5vok1^Tp zza5~_rM0s2{QoAdn`hV0nRG5-eqnv{N2RN3SMEGGY_2$o?Tq?%u@rq z|IaDtSn?)tznXxm{kxJK8NOvFwTmoPDQ}Dsx$kwnlc|5D_iM?zlzr=ecTSPL8NK6g z)4LT_$t;UJA8%Vb^XikB^wY_U;vHNjl(8?Wj{Kx3UwP_s(C&!LAlu$syn7dYSZ4n+ z*lx0srOSPn>uXo1E?V|uht{G5KR5fk6hq#}u=F-y21{ukda$uimC; z_Sk)&Xnsdd!}s+(mrOr5{malb7W={SPmFneV(?>tBEW$1{@h@s`T_ q`YUeL{77QuP-tLaq7m``!4Kx7NQrZwcCX9U=i_jaSW-r z_4azcPiU#k@sIiiJ2mS=Wafq)o*Kco)m4|Phf6W`sKf4nPYYNr7j9Zsc)SW50TUw)&lsP+9gS-Pwc6{Gg?J$RVP1S=Pxx3E4zxaL5 z+uxSoOV3;W{?}L7sw3Ds^Qdhd{@PZZ;U%IfXKNH62y9s%?&Hr_(*8b%Ct#MKRE)i~;@{Nwoi-D$@!YoQH*XVD{U=edMh0TU>mBAzJ+yh_-ot+ri-qRD;4;=FGqdJm?!1i?x`mC_xA(~CYp6XF=K$&t zIp)UpX=^T1)}_mrFWaX+az3D0eNOk)+gOFuiW#j3R+qKRUfv#A;QV93R8tcZoh@PJ znK!Q#EWUdCq(iQV<=X7$Za>c3c-W5dlWfyA zksHbKo3HM(dAvGlJMUWOyi4rg{{E6?fBd~J<^ImUKjfsFb~x^tBC^oZNPVe%!{RXM zu3DBCo37?lCuH_7yR%iX$~r_KWA z9p>-41XAX%e~0m zn;XxcxyK^+CExzrwJCc9jN6`nW83T}b@tmsR$k{j3T7$a-7_|^$Dirkyu;dz->D$E z>E_z|eH#0AovS&T8vJ7W)14R1c8hZOdcR=a)t#IhRL8G!?{oPD^D^O>5AO3NFUm(V zide@9^t)v#F!5~Re_ww{wl=xT?>qmSzoHG_c1&HoYn9x;;Zk36&QV*0suJ?|6z?EbG0dr?30ATr~z!oRFPi=XX!zs8{gRA_j* L`njxgN@xNA`v&8Y diff --git a/testing/resources/embedder_tests/hello_world_removed_hello_world_skia_linux.png b/testing/resources/embedder_tests/hello_world_removed_hello_world_skia_linux.png deleted file mode 100644 index 1f9395913f03c4602242cc9438e4e288cbb24856..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1090 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{=#;jKx9jP7LeL$-HD>VE*Ij;uunK z>+SV?pU_g7;~&?5Kg7z!ZM=)2*Jcc&Xp1 zrCWJAObV|FyjUOba@M*-f_4ULx26k7p=(coucXN*5uD{;TbeT@)Ew%QMA~e;!S!T;#HMh_7e_Yd!sAoZ_8iHY5L>|K2Ci_H><%FID*BZt}VfGezwigokCeChTT)nh{Z;Jji?c3a2BChC~`tFeEeZT)z z`m)?I=P4;i=Lza>v3$e-Wcz`v1Rl*EAD4CDn?&VU(a;*nZQi`o?BLB zw?972zMnMx=ril>C8zlIn$K>%?SG>`uVYfBVTbswX)iAywzF3+`*YH2#(n{X;*$jh zydSzvV>a+Q%(ZkWYS7E&c9Qjd=X3iXTl5(}n!3qcw|-Lkw5=_L&QtD4Hdics zYh2s3<#sp2mPmH(b(Z`WfAHSf#*wj|*+-j|>x|;061H7$j4P_bt|}LpE&O+W>C>l{ z);}uTt{UyRATOZ*tNsNS&w6%L-RelF{r5}E)ytm_#7 diff --git a/testing/resources/embedder_tests/hello_world_removed_hello_world_skia_mac.png b/testing/resources/embedder_tests/hello_world_removed_hello_world_skia_mac.png deleted file mode 100644 index 01ea206e60c00af36d852bee61869bf9ca3e36b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1080 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCVE*sv;uunK>+SW6+0mg4$3Nb; zFNk{|Jnz$mcAGDX3LJ_8OiNn=+$6Y_PIWDw)NUEY#+F!;ot>Mybc*haHBK`awU@f4 zyK-o+=()H^fG2kAm$KruE4|+4-AOaQZSwPH!QH*D1LWJn@BEm%{Eqjz@1Giri~SBP zPjL`%WD#_sE>ZbP@iw=7?e$;noy8xeepku;Ke+Tqto@dqS9myzlvx?lUc6V|$36Sx zi^ujA5`FSkebEOUvJU*XbS#FQ>p$-j{_>{Al#iC4?^3GEPkNo&bSZRFu%WQsHdnJx zimR(-%qCw9x}vgb?Tx@mXO7P5omlqS=V1KA?upt@a+Y}Lx$0FfOy0Tq+7$yC`zgo& zIwNb73~4 zW8UKaCnZ{|ko@}3S!)e|Vg&Z~ANvkCmH{TO7 zi#YZ~d10GmrQPZ2eDe>#kL!48CjO{h&yBf>=aEmhiv0ne_#G|IjLUs1fb^KDTr?ff9 zH=#G(uq62&m-&s}?d$gPtubi4Ql#2s{bc$9k&`@K+LzU?K6!aTKW`;R%ww$&d|*SQ zUf{0&sU}dBfgvM z^Y32pouL*jc1@0}bnC<#=2H7FM(^0lGjgu%`F#G`{MiMY%g+A|DBqKxyY0?mhkplj zqS}+LBlGTGlh>wxK0)NWpW?^m YlMZ}hU%~KR5>zC3y85}Sb4q9e0MXFJ`v3p{ diff --git a/testing/resources/embedder_tests/hello_world_removed_hello_world_skia_win.png b/testing/resources/embedder_tests/hello_world_removed_hello_world_skia_win.png deleted file mode 100644 index 179b5775a6690afc5e1cc6c50ed616c07f315beb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 715 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCV4CFV;uunK>+SW8YnK>^v_8B% z`Sb$z=@0l;9N-OTkXBgE@LaFq&c@H1896GneK)L5UHbjY{S2Y`AJuEtJN{EtRd8rv zU}R$95TKm#r{u)6B?jBibI*P=<=?;lZaGKSe8)}Gu5DZL>#X8xv)g5-?#me2mfu(; zGW%`mq-S~66Q5~WFV)SsC7XVG-s0G%WkvdLv&yb!mA?%S@N!-ILhy@N%8S!!pCl|x z@}ur1Z}HB^oBT$k=)Go-@8PnDy)DngY zMcVD%tCr_fPn>J=Cbl$V>*`|{vZ^`z<7U6z;a4{A{emThZ~k&=ef0I1xTMU?$;(b| z@~MxD<7^i_l6h-0|Mje2wtt%1*SyQz-5g|9{e(;F<=MqoqoeJeZwUuol{GV$y(;Hf z-Rl<}{+}gN-$~~2-wZp4ZR$rZM;*?0|Kt-j{b=e`qtu;^V1o= zK>Ai>*`=GNaY^UCSxmRhI=OMzQPtmkyA;ANRGU|aty`OR_OR`o!^`4=y-RbRUy-Wi z+qT)w`Ewe#eYSGe)=AAM#0qAAAl{oOa~zH6V7TUxn&uP;~S4Q21*Q2Tcicib+U z)0dqWG~;)2y7R@dD-|rU6SQBro|u2_v(%QiFaF2;XECbcd;FT={C%OIbDxiXr$(e> dB%Xa&^#9C`_WW7l_6n3rJzf1=);T3K0RYMHC>H<# diff --git a/testing/resources/embedder_tests/hello_world_removed_skia_linux.png b/testing/resources/embedder_tests/hello_world_removed_skia_linux.png deleted file mode 100644 index f0804e07d5d9b095021de98c6e90e9c15c17f8b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 643 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCVDj>GaSW-r_4b;#N3^5Jv5zi- zM`w6&zRT9ib5S}q&@>)mJozHti10$Hq9ea+%vY}=9`#{tbQ%{{oVH!USFYvxJ0 zp|<4atnIZylONxFyTwlGWYvasdpGP(OL?<#-VUw(BJnOMuNLk#G@JMA*WW z#fwe%k>|7}s#^nQtI4iM!wZeDwM z1Xbd6#C&75&-p)3WT*@XI4$+_>v6-qy*$y}i#yEctvwYN`+JW5>wU(bdQ2X-aTM*m z{nqW(ti1u{MvN-4*Kcs0`*WaXPuAXjU+Yd!n|5hatY&=Jt9drcsn!o~M|HAZf6FrA zWm`%vTjQIvXSVKH%p1K*tzWTIw9+l=9;bZDyGJJz^{0P1D^*vk?pc*4XX@+Oer=xK zUE8*p^CyijRq5AU&p+;YZg139F8xQwx%$(+ua+E_@x0`i626f?NY{4$=X(*YcYA;M z{0{zfMf7t`O6cJq3VeM2zkW|*yIfcA{>uAO#sBYL_&s0s{%g}e^;ZASR$^oF$^N!K YOrM*C@Axf<{|-ubp00i_>zopr00)2nF8}}l diff --git a/testing/resources/embedder_tests/hello_world_removed_skia_win.png b/testing/resources/embedder_tests/hello_world_removed_skia_win.png deleted file mode 100644 index 1af9e44411ad93975d798a529764b4552b45683b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5m8A!&LZC(qci_@$_B)i@7#J93JY5_^DsH{Kve1v&QKa?Z?uD{Z+u4F*LNjHv zE>%wGDs@%3)~NN`fH%_8IPz3ww9IUi6AL+??Ej?_Uo@%MSKNY`ksR=I|B1sUQQErw z?{thUR$j^#R56e8?AmM3U#a=(U%#SR|K9MoDz?_D+t;(ruDm*RTdIKZ^xLs-YWec_ zei59sZL^HnC(9#29*aXat-kU5%2K~ee?I=*V3{lSX=QiTDaE;NN9^DFDKAR$;QO`C zTYtUz{Nz~H@}%phJGX9?ez#=F)^Ar6+_TRf`XVkSulFG==y)>=h9`c0+{YlI*&t>- R#{d+>44$rjF6*2Ung9oihzkG! diff --git a/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world.dump.txt b/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world.dump.txt new file mode 100644 index 0000000000..bc63450252 --- /dev/null +++ b/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world.dump.txt @@ -0,0 +1,8 @@ +SaveState +SetBaseClip [0,0,200,200] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,200.0000) line(0.0000,0.0000) line(200.0000,0.0000) line(200.0000,200.0000) line(0.0000,200.0000,close)] +SaveState +DrawDeviceText font="Arimo" size=16.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,20.0000,100.0000] glyphs=[(idx=42,u=U+0047,origin=(0.0000,0.0000)) (idx=82,u=U+006F,origin=(12.4480,0.0000)) (idx=82,u=U+006F,origin=(21.3440,0.0000)) (idx=71,u=U+0064,origin=(30.2400,0.0000)) (idx=69,u=U+0062,origin=(39.1360,0.0000)) (idx=92,u=U+0079,origin=(48.0320,0.0000)) (idx=72,u=U+0065,origin=(56.0320,0.0000)) (idx=15,u=U+002C,origin=(64.9280,0.0000)) (idx=3,u=U+0020,origin=(69.3760,0.0000)) (idx=90,u=U+0077,origin=(73.8240,0.0000)) (idx=82,u=U+006F,origin=(85.3760,0.0000)) (idx=85,u=U+0072,origin=(94.2720,0.0000)) (idx=79,u=U+006C,origin=(99.6000,0.0000)) (idx=71,u=U+0064,origin=(103.1520,0.0000)) (idx=4,u=U+0021,origin=(112.0480,0.0000))] +DrawDeviceText font="Tinos" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,20.0000,150.0000] glyphs=[(idx=42,u=U+0047,origin=(0.0000,0.0000)) (idx=85,u=U+0072,origin=(8.6640,0.0000)) (idx=72,u=U+0065,origin=(12.6600,0.0000)) (idx=72,u=U+0065,origin=(17.9880,0.0000)) (idx=87,u=U+0074,origin=(23.3160,0.0000)) (idx=76,u=U+0069,origin=(26.6520,0.0000)) (idx=81,u=U+006E,origin=(29.9880,0.0000)) (idx=74,u=U+0067,origin=(35.9880,0.0000)) (idx=86,u=U+0073,origin=(41.9880,0.0000)) (idx=15,u=U+002C,origin=(46.6560,0.0000)) (idx=3,u=U+0020,origin=(49.6560,0.0000)) (idx=90,u=U+0077,origin=(52.6560,0.0000)) (idx=82,u=U+006F,origin=(61.3200,0.0000)) (idx=85,u=U+0072,origin=(67.3200,0.0000)) (idx=79,u=U+006C,origin=(71.3160,0.0000)) (idx=71,u=U+0064,origin=(74.6520,0.0000)) (idx=4,u=U+0021,origin=(80.6520,0.0000))] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_agg.png b/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_agg.png deleted file mode 100644 index ee56252ad918447d36d655c75a128bc1d9e77fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1783 zcmb`|X*U~)0><%FiwLpP+GA-ggN~&*WUSF31Qq)p+XzKbv6T|Bm1>y~qEbOMmbTPR zVyTM zO_XGwRa~~s_^>gLFt2N4wyBgYk)m?%PVUO(Fmq90KFT4Q3hrtlxG>Z9=4ph0IL7;) zY2-dFlXbc}$>uIPb9*_}HyXjT>%MZ9fJ;|I|G%uY=1m9w)*qF6PjQ@e3{%QHC%hg< zsu}0wqk+8^t7l!@j&1r5er8Ep_>0!5ZM!E;_v(_jx->eNjGE)Sv%yq%9~r}$1C0lz z?O;lHC&&ixPr3plFNivPl=**|ON1!7A)d3>PVe7-2q-WyoHb?!IYP&9UMESHvEj^b zvsZl*u|`@2uRazQXc@bE?H}y+k_Kt&mMwTtHcSu066Nr%~44I zy81EG*gaWgsPas_chPrl)Ee3u(YJe1`#{(h&6eD1xGCS0_WOf_Uwb_88wt|+UimA$ zbzn$E|A+6V9m_Q_+Xg#FLY(=5$#pY56OCTTKub9`$D&O4BW1XxaC%4X>oRs8=$j{q zZV=*>{!}-f8@6sHm4DoH9{h<%Opqa50yoOiICZ+)aiv0DU(w_y=k@D2kOb~ssr>ng z0q-d2{FAG_5y33>b3EOC)4yb9kMzR61+|$Px)?u|IO|+fGMw&yA?2)$R-QY8lVU);$`f8#}o129d0ns6&u#*oRJP zWK zo9V>SC2oLKr$qXH`W}AYaA*_OZBXNGCRh9HwTiZhhP{V&F-Biivys zbfB1E+fsnL5h+RrwC_Ng?=u~Ixm#)J>B543CdLHZ0>O*nJz>{E*Z0Kfu@pC}-5f%ajfso%Kd6l~dLp9cV`GB0w)QICEi- zP}sT*lOsbo{ot#_`J&rn*?lH#>|zW_7+F|V7NLZ#zN<_h3Q4p4>Z3I7AcG-xppPmA zIEVp+s;6AUjs?dzq`Wm;V5$lI=T@Edr}>R<;QYG`E3$HvPpsrJIlI zpm9K$adNy`W4Ekb=MT{jJRhHMUUXBLsDEVBo&c9WEEtr&rhU{L!V@Y`VfM->NL8V- z{+W2tT}-t9^YA~6OPDhs%k{fpha=x)Ya`cFs8{SZ@4WS|@+gGsJWWBq$;w+x&sbX9 zToH3scV37DGinsdemnrU!%g5u>QawQC5^X&K!V^9ZNmqg zRLG@_-YpTYEf$EqFnA*28&%_C!|T7l4AMbhiY9lZ1ZjmD_quu`Z?CjAJ{hWA=Ye5y zZ=H|Q9{41l2y=5tI8ThM4UHmkzj9}pw6mxnnc`u3jCtR$&dJ<0P^q%>}NObd2C#(t6 zhL3BDphoT*g|uZe7-!{fw-qXLBHp=sbfsT7Dz6cv&5H*1B;WtIs!wg?fP&ZWO_888 oTE*qIfg|-||4R_o!ny}9EmMQ+g0C)V{arMBTO{n2bx`(y0i8rEO#lD@ diff --git a/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_agg_mac.png b/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_agg_mac.png deleted file mode 100644 index 8f9fd9975aa23ab50031041285b088e75bdcda5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1678 zcmb_d`#;kQ0R0lt7V@~uWSW*yGzlZBjXXv}xX~t2c|^(e2+LzLVu{+kitGKVTQU*l zt(s;YQz068jnrMXR77TO{Rj7cKKF<7`04z1&bfBn*mHpGk$CoVLQ1Wrx!`wL}t1 zJOtKK&{$X?5-~-R<<*3u_=WlbNl{^Za)ckvTCHr`RXrPRkn8_$=@D9P>sHfR^Tj3s zw)`hioVTKtryL=CZOJ|GlJ2PU*vP;uMfNO;!Xr!6EtoX-$ z(HM2*ae3J~uHJI@#k&Uw(!HBau&pk`C{BuLUHP+6>HUu`WW5?EgPdS?r=<}uo+OFI zidMe@49El6G@b3;N?;ua+ityW1fcO&f_r$aMA1$3z0L&piJvi?yW*^|0n zguOepO#SQai0mjt(Dk_WZoq4vYBmcl-#J+LU>kx~;H&fiaWvLUy7m|dCV32;I547z z?g^M88b>+Ec=WJ`WX9WgfjgPKUk0hcPA)f{{l$Hx!-aO3sv!@WGK(iTBtw8l6ae~_ zbnP}+t;3g$nR5i70oFfSS*-ec7LMEFk`fSxLSs~f@a-)5FXKHz zeCERewS7=S&zvm7@3|qOk#eryr?!?34-Nic5`@td>$7kO6yrHdntD$OY$ug^RU}Dj zF2|PQbS!PqQ;OkM>2S!6;BPN`E|DYgx*yew0ynLdVHx_E5YM?7|Evc~@5Pl_{&F8gS}KDkpP7;f5+!8Av{ zLbc`A&P3;WmybO~Q7<-mhy4&dxH#*hvB4bjKtE{w`2`wF?m-~0?*b<5*qo>R47dl z^on__bdbEaj2aUY!ixfD!-CCRiC^cZwRHd`!YHrH(!Qc3LeL-AHT@MuzTkCn$Xyc; zE52e-`TU!AR(SB8cQIKcQ@K#555`YD)Kyo{dktW(^QT_S^m- zgl6w&QI}Li*!N1o`YH1S40!!p4AwgUsp@0UuKwP?b_M-L5pfRLWVE%`;`*tv8hF@| zJ##)=Lyo)>^u{N|e%Z38bYq7faRt?9NtfM3S-SR^Y#Il~aGn+17^^ADS1p>Mj&r#a z6@6zN)Z9_0h0W7}oTa71M;BhrBA-``$4js{&dqj(p9%ie(eNDu_vNbk&#pkK6DD(V zOp^@^_3vBAx?M?l{o(t;#mJ7Z5T{gplYk1rJf-GsyY+7KTc|H$(AvEy8s48&r+{mi zM8U&Rz6-;Ob;yrc)mE19Qfs^nrTbEbu~@&>4m+8N#vLok!Gqb2R|Enx6iQHY=6>{Y zb3JFG6Mw*{l<(lkHQ-C`_&37i;`#?bPr9Op~Xf#&7?1oo7WiCZ!q=sJ2hz Rf&5=b<6!G-Q)BH*{Rc)&5#Im+ diff --git a/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_skia_linux.png b/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_skia_linux.png deleted file mode 100644 index bdf9f5b655386b65a10a72e4a5ecb6a88aa96830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1594 zcmb`I`9ISQ0LSMJp+XrRzMFDpN|Z*t z4^YaPWh)R!RKN~yiM%_>os@J!qLf9ye}$ctloW&tonc!8V$RlwRs9o-v>vAG2|H)f z!8Q;Fdm7T9aZrJ&E(>?+RhDy*9nnnJ<$J)T4TDd+F(y#Ob@?PwIvTVob9}~P0A{z zCFa^mi4e)}cX-`~Xm=hdp^B_@pgs+g%7}3o*-uRUL-gACvK-gl+0++;FaOnLQGF02 zM}qvp&ruea%G%y-!v^boncnlhq23GHKgNqxW0PiNF-+vpPt-Akb5P4n9iX)cdnY-e z{Aw{_=BX)TKClHN&dtEz>3o5+P&z@u))ayi);w(D9F z%^Z@tMnN=;x>ZZ2-Zcv!h!YqRiQ@$;*g~dC(eAz{D2$#|>H$&E$14#O;?Vv+7_ zp_Pdtj~{99tv|D6jw25eRN8A>4tDJ9Y+I6$}_Ef)2 zUX#~{6FIC(j&yMm?Zjd_ECu=?1oE?p>mz!8LI~fm<}EEgxSiqS>Pi2SV(MG*Xd;%W zCI~gG^w*;EnCldj5G}w)=VHjHMod{h+E&L;pYQnjFg){C@O}wx=b-S!z=hF~bISGX z0>`k@g;+&}D*m+cGh)Rb>cH&T?c$zvS>3g?I4ZTz)Q*Ah~!a;Ale6mz&87>X*P@nQyy)U-6>+~k1xkd(iefG*2%+P%K z+S0^aHd@hy6nyUbkmw)tTGez#*?~B^%&_HcOH$v#^(ySCZp&FY0^GoHt5?^WFqfv+ z;lK^5Oi>x&g@Q9*y$i+%7m#kS<(WfH8fVc>HIZi{DDK)oXc(fJXw2HOW0;660Ih(K z)nk@HOifJvE0Rw*-w|ju>M9IpV7WIC;r}jI`G1a3J{wDS5HZ7t9Z)M#& zii$UZZhY!Vc(|rh-r06)Zh@ETrY#Yh{@qw=8uDOMMPFh%aa9`a=1pid_gb5deLEVI zFcM`u2rjX3X>V+t#H_YOX(!3=%7^`^GIP{8-4tCY)W4wOZ&si4r7A4etaS|i4$cM&1v-2G~b=~=Qml@Xn-=rS`V)7Nr z-Du3%ln5{WGua5Q$oaTT{xJ()1@3*jg7kb+0akUqkhfPpo3Y7c=t~n}XC;oiw^vd$ zT?_k(fMUM_$*cDmBKE+VR{J=M!7g6NyGi0T$S{~V%B*`KR;$z8d0lfwYs8`YMN&aj zz)LkXnp*Q_B=5+uMSTp8iyz{Ei=`XuIPlwhuXreK2{gLO-m8O*_<4wnV+rYR*NOU7 z^)7V_1S#cYHDt&n_9}iOgg+lfUQEBDh|LiD`kG35(5tj_zDE2_>`d;egL)3dL+3mY zaShw^mjMiWnz=E6YNM!U>UR$>MS2!iPu)yK(s3+e)Kz?Bo;a$5yQnO4qmfCeKq!@i zM+{r;C-OUj9#KcL3v`ccFlwip%sHwxDP;9Qw(4GU^m^AL;)+2n`GYqnkAL_Cf9DdW z&!ix5d^r#7aujIJcTRe6$pR!GeCRik5p*(M0NrP+04@K3{dEd<7ZLCpE8oQb0P8c& A)c^nh diff --git a/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_skia_mac.png b/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_skia_mac.png deleted file mode 100644 index 83a4d292988dc87c0d8409ba7b1a7d65dbb3c028..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1608 zcmb_d`!^E`9A9Y5b5dQ+bGWWYQ8bL%G8D5sTFc7g=#-nXm`60Pd92msgyxaQ$_f*` zJ<2POB3ipM^Qf?qSIf1;OssJ0Ke+dt`@`q)%jcKxIp5DG)6d64T}4L)005|CJl%0W zwf7gc{UiYWz@jSv00d*)(RlKRWMmx6BpCE8_8t5>#w#Gie(Vk++dy{$(MmVa?!R-P zTAA+b#@xb2T3ld>VaZ4+Q4_;H&y6IEDBGQI%k#GI)M7;HO!^z^bHUM!RTH1U3wi_h zGM$PO7P`gGHWfm@qGpTnSebL!ZD|78CXBbHp|=P+Z%aq3oz|r8?t%hs{%^Z<^{R8@ zO1EVGv6?f%9!s2l-VXPFCI*`J*lx`jQ}trRPTT}-1S?zqXkYKX<<*34fraeueK3f$ zk9~ye9|s9)JZR~cg#S5oEE?8(D z>cnLJVIjnEzD1!bC1w9Cq6{1!`FUyilI0Ar;WGvey&vHFvCd!pgdwaWiS>OoJALYKlH((y zg}yO6sHMbL?oZhG7<%n)c{3Ayx7qyLnM>3}rh>!-MT(5?vZJ>vbyNrQ13Ro_+-h~P zUxo^J|D9JA^$0fP%EiehR(6!JVXW-BRMzPzoiP@e82yAFnTs(rsk;h4%W4n?_%(NueA zB>y94MnN*~3npMxmMhYa8N5L#5f{8HeLKK^GB)XvTIQrYrV;em^j<~jsA-k;)`xN% zZJ4Q<+i*FePibhU;sUW#Jux_ownt~6ZcQE*nX-e&Me&07RxJ6N)-~Z+5d-%w3-)oC zSme8>x$?~#N)=U3iQR%*_bOZ@VXGXzJ$U$nk=sQBt@LpI-Lp^#z2zbB;wJgh2SQE| zNYGy%2x=PF3@2J3H#2;#5g%@XNprv=Ew~{`IrPKm)?~zLa;gWz%%pFuPq-@k>gmw& zO=00vpn_xNm{LIIpo9IRuDKlRnCMT4fvV%Fl2_Y$u)?5qhRBac&bkkTJ-Y3WAJ#FKMi_4VzTcy z_+?@I)3lM_#dU@o4qJ9VBIZmSUvdzkjc9NALOW+A+D^ZCOlpKdzv?PQm7&l}lM_3wX=8XL7Ox{`)~74 zgJfdsT!T< F`~#i0`aS>v diff --git a/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_skia_win.png b/testing/resources/embedder_tests/hello_world_split_streams_removed_hello_world_skia_win.png deleted file mode 100644 index 286070a9c9273524b8be3d811c4a680d0bfbdf1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 972 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCV4m#h;uunK>+P+L6CYcMv^+f5 znW(_t*1#ii(7S_0(|d>VwOqOYWXuFsD1}qUwvt2@B=Lgp-e4S-I=t zbIDUzGCU_Ne_`vtIE&$OZ)w(+mqwPN5z8B_Y@3RrZfWddvE{y0vhtHDqmOnmLwW8J zhA_u#4ZF83l+KZIHcyzVw{_cr8gGHq${N{kvhABs{qgabxTH+P>D-%s&(!}L=9(^Y zIwNq}aQ#aAS@(|!yjt>${DGL^ZWFFcOJtd0?q`8pCT$M zOY3LHep{{SHQ`mZf+h3Uz54m{D_b_ItDJbNI-z#!U-1*^>y7uw1l?cf@5!a&I4#P< zRQ1!ox0{ySIxl-;30KNhE!D0ia-x%_DE#tPc;32AN?>YG)&(QZszvG^dsPLVe!P<9 z(Dve$%LFSIRi-!|&Xw10)c@3&bjfgK?mRcP7GQ{qGh*VsnXiBduv=(-wFlRH`CLWI)zOP z3KLnX=egBmX3-iG=XW2%-t6@deapLe567q97rDRuNzeW1?da9GiF;nXht1bm@1SR| jdG`O6A|ZRk*Zg6=#4_)|i&-AJpls^t>gTe~DWM4fB^9t1 diff --git a/testing/resources/embedder_tests/split_streams_removed_stream1.dump.txt b/testing/resources/embedder_tests/split_streams_removed_stream1.dump.txt new file mode 100644 index 0000000000..4a8f41a1c6 --- /dev/null +++ b/testing/resources/embedder_tests/split_streams_removed_stream1.dump.txt @@ -0,0 +1,22 @@ +SaveState +SetBaseClip [0,0,200,200] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,200.0000) line(0.0000,0.0000) line(200.0000,0.0000) line(200.0000,200.0000) line(0.0000,200.0000,close)] +SaveState +DrawDeviceText font="Cousine" size=9.0000 color=0xb3000000 matrix=[1.0000,0.0000,0.0000,-1.0000,120.0000,100.0000] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(5.4000,0.0000)) (idx=86,u=U+0073,origin=(10.8000,0.0000)) (idx=87,u=U+0074,origin=(16.2000,0.0000)) (idx=3,u=U+0020,origin=(21.6000,0.0000)) (idx=20,u=U+0031,origin=(27.0000,0.0000))] +DrawDeviceText font="Tinos" size=9.0000 color=0xb300000d matrix=[0.9956,0.3418,0.3418,-0.9956,119.9120,106.8358] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(6.0030,0.0000)) (idx=86,u=U+0073,origin=(9.9990,0.0000)) (idx=87,u=U+0074,origin=(13.5000,0.0000)) (idx=3,u=U+0020,origin=(16.4970,0.0000)) (idx=21,u=U+0032,origin=(18.7470,0.0000))] +DrawDeviceText font="Cousine" size=9.0000 color=0xb300001a matrix=[0.8722,0.6789,0.6789,-0.8722,117.4440,113.5773] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(5.4000,0.0000)) (idx=86,u=U+0073,origin=(10.8000,0.0000)) (idx=87,u=U+0074,origin=(16.2000,0.0000)) (idx=3,u=U+0020,origin=(21.6000,0.0000)) (idx=22,u=U+0033,origin=(27.0000,0.0000))] +DrawDeviceText font="Tinos" size=9.0000 color=0xb3000028 matrix=[0.6333,0.9694,0.9694,-0.6333,112.6660,119.3870] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(6.0030,0.0000)) (idx=86,u=U+0073,origin=(9.9990,0.0000)) (idx=87,u=U+0074,origin=(13.5000,0.0000)) (idx=3,u=U+0020,origin=(16.4970,0.0000)) (idx=23,u=U+0034,origin=(18.7470,0.0000))] +DrawDeviceText font="Cousine" size=9.0000 color=0xb3000035 matrix=[0.2972,1.1735,1.1735,-0.2972,105.9430,123.4697] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(5.4000,0.0000)) (idx=86,u=U+0073,origin=(10.8000,0.0000)) (idx=87,u=U+0074,origin=(16.2000,0.0000)) (idx=3,u=U+0020,origin=(21.6000,0.0000)) (idx=24,u=U+0035,origin=(27.0000,0.0000))] +DrawDeviceText font="Tinos" size=9.0000 color=0xb3000043 matrix=[-0.1043,1.2588,1.2588,0.1043,97.9138,125.1769] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(6.0030,0.0000)) (idx=86,u=U+0073,origin=(9.9990,0.0000)) (idx=87,u=U+0074,origin=(13.5000,0.0000)) (idx=3,u=U+0020,origin=(16.4970,0.0000)) (idx=25,u=U+0036,origin=(18.7470,0.0000))] +DrawDeviceText font="Cousine" size=9.0000 color=0xb3000050 matrix=[-0.5285,1.2050,1.2050,0.5285,89.4291,124.0993] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(5.4000,0.0000)) (idx=86,u=U+0073,origin=(10.8000,0.0000)) (idx=87,u=U+0074,origin=(16.2000,0.0000)) (idx=3,u=U+0020,origin=(21.6000,0.0000)) (idx=26,u=U+0037,origin=(27.0000,0.0000))] +DrawDeviceText font="Tinos" size=9.0000 color=0xb300005d matrix=[-0.9268,1.0068,1.0068,0.9268,81.4639,120.1356] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(6.0030,0.0000)) (idx=86,u=U+0073,origin=(9.9990,0.0000)) (idx=87,u=U+0074,origin=(13.5000,0.0000)) (idx=3,u=U+0020,origin=(16.4970,0.0000)) (idx=27,u=U+0038,origin=(18.7470,0.0000))] +DrawDeviceText font="Cousine" size=9.0000 color=0xb300006b matrix=[-1.2498,0.6763,0.6763,1.2498,75.0044,113.5269] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(5.4000,0.0000)) (idx=86,u=U+0073,origin=(10.8000,0.0000)) (idx=87,u=U+0074,origin=(16.2000,0.0000)) (idx=3,u=U+0020,origin=(21.6000,0.0000)) (idx=28,u=U+0039,origin=(27.0000,0.0000))] +DrawDeviceText font="Tinos" size=9.0000 color=0xb3000078 matrix=[-1.4536,0.2426,0.2426,1.4536,70.9283,104.8512] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(6.0030,0.0000)) (idx=86,u=U+0073,origin=(9.9990,0.0000)) (idx=87,u=U+0074,origin=(13.5000,0.0000)) (idx=3,u=U+0020,origin=(16.4970,0.0000)) (idx=20,u=U+0031,origin=(18.7470,0.0000)) (idx=19,u=U+0030,origin=(23.2470,0.0000))] +DrawDeviceText font="Cousine" size=9.0000 color=0xb3000086 matrix=[-1.5055,-0.2512,-0.2512,1.5055,69.8900,94.9760] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(5.4000,0.0000)) (idx=86,u=U+0073,origin=(10.8000,0.0000)) (idx=87,u=U+0074,origin=(16.2000,0.0000)) (idx=3,u=U+0020,origin=(21.6000,0.0000)) (idx=20,u=U+0031,origin=(27.0000,0.0000)) (idx=20,u=U+0031,origin=(32.4000,0.0000))] +DrawDeviceText font="Tinos" size=9.0000 color=0xb3000093 matrix=[-1.3886,-0.7515,-0.7515,1.3886,72.2271,84.9700] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(6.0030,0.0000)) (idx=86,u=U+0073,origin=(9.9990,0.0000)) (idx=87,u=U+0074,origin=(13.5000,0.0000)) (idx=3,u=U+0020,origin=(16.4970,0.0000)) (idx=20,u=U+0031,origin=(18.7470,0.0000)) (idx=21,u=U+0032,origin=(23.2470,0.0000))] +DrawDeviceText font="Cousine" size=9.0000 color=0xb30000a1 matrix=[-1.1050,-1.2004,-1.2004,1.1050,77.8992,75.9920] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(5.4000,0.0000)) (idx=86,u=U+0073,origin=(10.8000,0.0000)) (idx=87,u=U+0074,origin=(16.2000,0.0000)) (idx=3,u=U+0020,origin=(21.6000,0.0000)) (idx=20,u=U+0031,origin=(27.0000,0.0000)) (idx=22,u=U+0033,origin=(32.4000,0.0000))] +DrawDeviceText font="Tinos" size=9.0000 color=0xb30000ae matrix=[-0.6765,-1.5424,-1.5424,0.6765,86.4692,69.1530] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(6.0030,0.0000)) (idx=86,u=U+0073,origin=(9.9990,0.0000)) (idx=87,u=U+0074,origin=(13.5000,0.0000)) (idx=3,u=U+0020,origin=(16.4970,0.0000)) (idx=20,u=U+0031,origin=(18.7470,0.0000)) (idx=23,u=U+0034,origin=(23.2470,0.0000))] +DrawDeviceText font="Cousine" size=9.0000 color=0xb30000bb matrix=[-0.1434,-1.7309,-1.7309,0.1434,97.1315,65.3820] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(5.4000,0.0000)) (idx=86,u=U+0073,origin=(10.8000,0.0000)) (idx=87,u=U+0074,origin=(16.2000,0.0000)) (idx=3,u=U+0020,origin=(21.6000,0.0000)) (idx=20,u=U+0031,origin=(27.0000,0.0000)) (idx=24,u=U+0035,origin=(32.4000,0.0000))] +DrawDeviceText font="Cousine" size=9.0000 color=0xb30000f1 matrix=[1.8419,-0.6323,-0.6323,-1.8419,136.8370,87.3540] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(5.4000,0.0000)) (idx=86,u=U+0073,origin=(10.8000,0.0000)) (idx=87,u=U+0074,origin=(16.2000,0.0000)) (idx=3,u=U+0020,origin=(21.6000,0.0000)) (idx=20,u=U+0031,origin=(27.0000,0.0000)) (idx=28,u=U+0039,origin=(32.4000,0.0000))] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/split_streams_removed_stream1_agg.png b/testing/resources/embedder_tests/split_streams_removed_stream1_agg.png deleted file mode 100644 index 4b1202eba09b1130601bfac128707a5a91a1c008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12277 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 diff --git a/testing/resources/embedder_tests/split_streams_removed_stream1_agg_mac.png b/testing/resources/embedder_tests/split_streams_removed_stream1_agg_mac.png deleted file mode 100644 index 50acbc4b1e4ff1f60c2e4c38504071974a2896f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11220 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 BCXo>sTTrO*@gVW(4}|_p|J9P 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 diff --git a/testing/resources/embedder_tests/split_streams_removed_stream1_skia_linux.png b/testing/resources/embedder_tests/split_streams_removed_stream1_skia_linux.png deleted file mode 100644 index 726e0fa4e091ddb8eacbe93caf5bea8974ee025f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10987 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 Date: Wed, 14 Oct 2026 10:52:45 -0700 Subject: [PATCH 23/37] Simplify CFX_Path::GetRect() checks in cfx_path_unittest.cpp Combine std::optional::has_value() and std::optional::value() checks on CFX_Path::GetRect() into single EXPECT_EQ() calls, and inline the rest of the `rect` checks into EXPECT_FALSE(path.GetRect(...).has_value()). TAG=agy CONV=6567e49a-585d-49fa-a2a2-cea8e1071f98 Change-Id: I774f0286072a80560b29ef2e17f7f90793b8029a Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160870 Reviewed-by: Andy Phan Commit-Queue: Lei Zhang --- core/fxge/cfx_path_unittest.cpp | 142 +++++++++----------------------- 1 file changed, 39 insertions(+), 103 deletions(-) diff --git a/core/fxge/cfx_path_unittest.cpp b/core/fxge/cfx_path_unittest.cpp index c8e127422e..688fab13e8 100644 --- a/core/fxge/cfx_path_unittest.cpp +++ b/core/fxge/cfx_path_unittest.cpp @@ -12,15 +12,11 @@ TEST(CFXPath, BasicTest) { path.AppendRect(/*left=*/1, /*bottom=*/2, /*right=*/3, /*top=*/5); EXPECT_EQ(5u, path.GetPoints().size()); EXPECT_TRUE(path.IsRect()); - std::optional rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), rect.value()); + EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), path.GetRect(nullptr)); EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), path.GetBoundingBox()); const CFX_Matrix kScaleMatrix(1, 0, 0, 2, 60, 70); - rect = path.GetRect(&kScaleMatrix); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(61, 74, 63, 80), rect.value()); + EXPECT_EQ(CFX_FloatRect(61, 74, 63, 80), path.GetRect(&kScaleMatrix)); EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), path.GetBoundingBox()); path.Clear(); @@ -35,32 +31,25 @@ TEST(CFXPath, BasicTest) { path.AppendPoint({1, 0}, CFX_Path::Point::Type::kLine); EXPECT_EQ(4u, path.GetPoints().size()); EXPECT_FALSE(path.IsRect()); - rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), path.GetBoundingBox()); // 4 points with a closed path makes a rect. path.ClosePath(); EXPECT_EQ(4u, path.GetPoints().size()); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), path.GetRect(nullptr)); EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), path.GetBoundingBox()); path.Transform(kScaleMatrix); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(60, 70, 61, 72), rect.value()); + EXPECT_EQ(CFX_FloatRect(60, 70, 61, 72), path.GetRect(nullptr)); EXPECT_EQ(CFX_FloatRect(60, 70, 61, 72), path.GetBoundingBox()); path.Clear(); path.AppendFloatRect({1, 2, 3, 5}); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), rect.value()); + EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), path.GetRect(nullptr)); EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), path.GetBoundingBox()); } @@ -70,27 +59,21 @@ TEST(CFXPath, ShearTransform) { const CFX_Matrix kShearMatrix(1, 2, 0, 1, 0, 0); EXPECT_TRUE(path.IsRect()); - std::optional rect = path.GetRect(&kShearMatrix); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(&kShearMatrix).has_value()); EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), path.GetBoundingBox()); path.Transform(kShearMatrix); EXPECT_FALSE(path.IsRect()); - rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); EXPECT_EQ(CFX_FloatRect(1, 4, 3, 11), path.GetBoundingBox()); const CFX_Matrix shear_inverse_matrix = kShearMatrix.GetInverse(); - rect = path.GetRect(&shear_inverse_matrix); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), rect.value()); + EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), path.GetRect(&shear_inverse_matrix)); EXPECT_EQ(CFX_FloatRect(1, 4, 3, 11), path.GetBoundingBox()); path.Transform(shear_inverse_matrix); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), rect.value()); + EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), path.GetRect(nullptr)); EXPECT_EQ(CFX_FloatRect(1, 2, 3, 5), path.GetBoundingBox()); } @@ -148,22 +131,18 @@ TEST(CFXPath, ClosePath) { EXPECT_EQ(CFX_Path::Point::Type::kLine, path.GetType(3)); EXPECT_FALSE(path.IsClosingFigure(3)); EXPECT_FALSE(path.IsRect()); - std::optional rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); const CFX_Matrix kIdentityMatrix; ASSERT_TRUE(kIdentityMatrix.IsIdentity()); - rect = path.GetRect(&kIdentityMatrix); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(&kIdentityMatrix).has_value()); path.ClosePath(); ASSERT_EQ(4u, path.GetPoints().size()); EXPECT_EQ(CFX_Path::Point::Type::kLine, path.GetType(3)); EXPECT_TRUE(path.IsClosingFigure(3)); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), path.GetRect(nullptr)); // Calling ClosePath() repeatedly makes no difference. path.ClosePath(); @@ -171,9 +150,7 @@ TEST(CFXPath, ClosePath) { EXPECT_EQ(CFX_Path::Point::Type::kLine, path.GetType(3)); EXPECT_TRUE(path.IsClosingFigure(3)); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), path.GetRect(nullptr)); path.AppendPointAndClose({0, 0}, CFX_Path::Point::Type::kLine); ASSERT_EQ(5u, path.GetPoints().size()); @@ -182,9 +159,7 @@ TEST(CFXPath, ClosePath) { EXPECT_EQ(CFX_Path::Point::Type::kLine, path.GetType(4)); EXPECT_TRUE(path.IsClosingFigure(4)); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 1, 1), path.GetRect(nullptr)); } TEST(CFXPath, FivePointRect) { @@ -198,18 +173,14 @@ TEST(CFXPath, FivePointRect) { EXPECT_EQ(CFX_Path::Point::Type::kLine, path.GetType(4)); EXPECT_FALSE(path.IsClosingFigure(4)); EXPECT_TRUE(path.IsRect()); - std::optional rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetRect(nullptr)); path.ClosePath(); ASSERT_EQ(5u, path.GetPoints().size()); EXPECT_EQ(CFX_Path::Point::Type::kLine, path.GetType(4)); EXPECT_TRUE(path.IsClosingFigure(4)); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetRect(nullptr)); // 4-point rect with a duplicate point. path.Clear(); @@ -224,9 +195,7 @@ TEST(CFXPath, FivePointRect) { path.ClosePath(); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetRect(nullptr)); // 4-point rect with a collinear point on an edge. path.Clear(); @@ -237,9 +206,7 @@ TEST(CFXPath, FivePointRect) { path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); ASSERT_EQ(5u, path.GetPoints().size()); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetRect(nullptr)); // 4-point rect with a collinear point on the closing edge. path.Clear(); @@ -250,9 +217,7 @@ TEST(CFXPath, FivePointRect) { path.AppendPointAndClose({0, 0.1f}, CFX_Path::Point::Type::kLine); ASSERT_EQ(5u, path.GetPoints().size()); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetRect(nullptr)); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); } @@ -265,9 +230,7 @@ TEST(CFXPath, SixPlusPointRect) { path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); path.AppendPoint({0, 0}, CFX_Path::Point::Type::kLine); EXPECT_TRUE(path.IsRect()); - std::optional rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetRect(nullptr)); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); path.Clear(); @@ -285,9 +248,7 @@ TEST(CFXPath, SixPlusPointRect) { path.AppendPoint({0, 0}, CFX_Path::Point::Type::kLine); path.AppendPoint({0, 0}, CFX_Path::Point::Type::kLine); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetRect(nullptr)); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); // 4-point rect with duplicate points that does not repeat the start point at @@ -301,9 +262,7 @@ TEST(CFXPath, SixPlusPointRect) { path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); ASSERT_EQ(6u, path.GetPoints().size()); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetRect(nullptr)); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); } @@ -364,14 +323,10 @@ TEST(CFXPath, SixPlusPointRectWithCollinearPoints) { path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); ASSERT_EQ(6u, path.GetPoints().size()); EXPECT_TRUE(path.IsRect()); - std::optional rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetRect(nullptr)); constexpr CFX_Matrix kScaleMatrix(1, 0, 0, 2, 60, 70); - rect = path.GetRect(&kScaleMatrix); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(60, 70, 62, 72), rect.value()); + EXPECT_EQ(CFX_FloatRect(60, 70, 62, 72), path.GetRect(&kScaleMatrix)); // An extra point on a vertical edge. path.Clear(); @@ -382,9 +337,7 @@ TEST(CFXPath, SixPlusPointRectWithCollinearPoints) { path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); path.AppendPointAndClose({0, 0}, CFX_Path::Point::Type::kLine); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetRect(nullptr)); // Extra points on two edges. path.Clear(); @@ -397,9 +350,7 @@ TEST(CFXPath, SixPlusPointRectWithCollinearPoints) { path.AppendPointAndClose({0, 0}, CFX_Path::Point::Type::kLine); ASSERT_EQ(7u, path.GetPoints().size()); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(&kScaleMatrix); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(60, 70, 62, 72), rect.value()); + EXPECT_EQ(CFX_FloatRect(60, 70, 62, 72), path.GetRect(&kScaleMatrix)); // Same as above, but closed without repeating the first point. path.Clear(); @@ -411,12 +362,8 @@ TEST(CFXPath, SixPlusPointRectWithCollinearPoints) { path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); ASSERT_EQ(6u, path.GetPoints().size()); EXPECT_TRUE(path.IsRect()); - rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), rect.value()); - rect = path.GetRect(&kScaleMatrix); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(60, 70, 62, 72), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetRect(nullptr)); + EXPECT_EQ(CFX_FloatRect(60, 70, 62, 72), path.GetRect(&kScaleMatrix)); // A point that goes past the corner and back is not in between its // neighbors, so the path is not a rectangle. @@ -450,8 +397,7 @@ TEST(CFXPath, NotRect) { path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); path.AppendPoint({0, 0.1f}, CFX_Path::Point::Type::kLine); EXPECT_FALSE(path.IsRect()); - std::optional rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); path.Clear(); @@ -460,8 +406,7 @@ TEST(CFXPath, NotRect) { path.AppendPoint({3, 1}, CFX_Path::Point::Type::kLine); path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); EXPECT_FALSE(path.IsRect()); - rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 3, 1), path.GetBoundingBox()); path.Clear(); @@ -470,8 +415,7 @@ TEST(CFXPath, NotRect) { path.AppendPoint({2, 1}, CFX_Path::Point::Type::kLine); path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kMove); EXPECT_FALSE(path.IsRect()); - rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); path.Clear(); @@ -480,8 +424,7 @@ TEST(CFXPath, NotRect) { path.AppendPoint({3, 0}, CFX_Path::Point::Type::kLine); path.AppendPointAndClose({0, 1}, CFX_Path::Point::Type::kLine); EXPECT_FALSE(path.IsRect()); - rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 3, 1), path.GetBoundingBox()); path.Clear(); @@ -491,8 +434,7 @@ TEST(CFXPath, NotRect) { path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); path.AppendPoint({0, 0}, CFX_Path::Point::Type::kLine); EXPECT_FALSE(path.IsRect()); - rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); path.Clear(); @@ -502,8 +444,7 @@ TEST(CFXPath, NotRect) { path.AppendPoint({2, 0}, CFX_Path::Point::Type::kLine); path.AppendPoint({0, 0}, CFX_Path::Point::Type::kLine); EXPECT_FALSE(path.IsRect()); - rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); path.Clear(); @@ -513,8 +454,7 @@ TEST(CFXPath, NotRect) { path.AppendPointAndClose({2, 1}, CFX_Path::Point::Type::kLine); path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); EXPECT_FALSE(path.IsRect()); - rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 1), path.GetBoundingBox()); path.Clear(); @@ -523,11 +463,9 @@ TEST(CFXPath, NotRect) { path.AppendPoint({2, 1}, CFX_Path::Point::Type::kLine); path.AppendPoint({2, 2}, CFX_Path::Point::Type::kLine); EXPECT_FALSE(path.IsRect()); - rect = path.GetRect(nullptr); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(nullptr).has_value()); const CFX_Matrix kScaleMatrix(1, 0, 0, 2, 60, 70); - rect = path.GetRect(&kScaleMatrix); - EXPECT_FALSE(rect.has_value()); + EXPECT_FALSE(path.GetRect(&kScaleMatrix).has_value()); EXPECT_EQ(CFX_FloatRect(0, 0, 2, 2), path.GetBoundingBox()); } @@ -540,9 +478,7 @@ TEST(CFXPath, EmptyRect) { path.AppendPoint({0, 1}, CFX_Path::Point::Type::kLine); path.AppendPoint({0, 0}, CFX_Path::Point::Type::kLine); EXPECT_TRUE(path.IsRect()); - std::optional rect = path.GetRect(nullptr); - ASSERT_TRUE(rect.has_value()); - EXPECT_EQ(CFX_FloatRect(0, 0, 0, 1), rect.value()); + EXPECT_EQ(CFX_FloatRect(0, 0, 0, 1), path.GetRect(nullptr)); EXPECT_EQ(CFX_FloatRect(0, 0, 0, 1), path.GetBoundingBox()); } From 616a2caa413ab02b0700de7d906a07ee17507637 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 14 Oct 2026 10:53:00 -0700 Subject: [PATCH 24/37] Tweak GetNormalizedPoints() inside cfx_path.cpp to return earlier Refactor GetNormalizedPoints() so the case where there are too many points can return slightly earlier by checking a vector size before appending to the vector. As such, the same vector can reserve one fewer element. Change-Id: I79f787c85e18bb0558042f340a8b7e48f788e086 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160890 Commit-Queue: Lei Zhang Reviewed-by: Andy Phan --- core/fxge/cfx_path.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/fxge/cfx_path.cpp b/core/fxge/cfx_path.cpp index 0845a69648..0bdc822c32 100644 --- a/core/fxge/cfx_path.cpp +++ b/core/fxge/cfx_path.cpp @@ -102,7 +102,7 @@ std::vector GetNormalizedPoints( } std::vector normalized; - normalized.reserve(expected_size + 1); + normalized.reserve(expected_size); normalized.push_back(points[0]); for (auto it = points.begin() + 1; it != points.end(); ++it) { // Exactly `expected_size` points left. Stop normalizing and take what is @@ -141,12 +141,12 @@ std::vector GetNormalizedPoints( } } - normalized.push_back(point); - // Too many points. Not considered as a rectangle. - if (normalized.size() > expected_size) { + if (normalized.size() >= expected_size) { return {}; } + + normalized.push_back(point); } DCHECK_EQ(expected_size, normalized.size()); From ac3cf1684db05bd68338acb84e3823e6feb72b5b Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Wed, 14 Oct 2026 11:02:52 -0700 Subject: [PATCH 25/37] CHECK on FFE teardown if embedder is inside a callback. This indicates a misbehaving embedder, so flag it with a CHECK() while it is still active on the stack. -- mass rename two hungarian length variables. -- consistently name AutoRestorer local `restorer` Bug: 572237007 Change-Id: Ice9212769e4072d76a427379aa13d02fa36be55d Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160615 Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- fpdfsdk/cpdfsdk_formfillenvironment.cpp | 169 +++++++++++++++++------- fpdfsdk/cpdfsdk_formfillenvironment.h | 9 +- 2 files changed, 124 insertions(+), 54 deletions(-) diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp index f6ce8cc18d..c882bfd82c 100644 --- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp +++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp @@ -75,6 +75,8 @@ CPDFSDK_FormFillEnvironment::CPDFSDK_FormFillEnvironment( } CPDFSDK_FormFillEnvironment::~CPDFSDK_FormFillEnvironment() { + CHECK(!in_active_ffi_callback_); + CHECK(!in_passive_ffi_callback_); being_destroyed_ = true; OnDetachFromDocument(); @@ -119,7 +121,7 @@ void CPDFSDK_FormFillEnvironment::OutputSelectedRect( CFX_PointF ptA = pFormField->PWLtoFFL(CFX_PointF(rect.left, rect.bottom)); CFX_PointF ptB = pFormField->PWLtoFFL(CFX_PointF(rect.right, rect.top)); - AutoRestorer ffi_restorer(&in_passive_ffi_callback_); + AutoRestorer restorer(&in_passive_ffi_callback_); in_passive_ffi_callback_ = true; info_->FFI_OutputSelectedRect(info_, pPage, ptA.x, ptB.y, ptB.x, ptA.y); } @@ -134,8 +136,10 @@ CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetCurrentView() { return pPage ? GetOrCreatePageView(pPage) : nullptr; } -IPDF_Page* CPDFSDK_FormFillEnvironment::GetCurrentPage() const { +IPDF_Page* CPDFSDK_FormFillEnvironment::GetCurrentPage() { if (info_ && info_->FFI_GetCurrentPage) { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; return IPDFPageFromFPDFPage(info_->FFI_GetCurrentPage( info_, FPDFDocumentFromCPDFDocument(cpdfdoc_.Get()))); } @@ -148,19 +152,29 @@ WideString CPDFSDK_FormFillEnvironment::GetLanguage() { return WideString(); } - int nRequiredLen = info_->FFI_GetLanguage(info_, nullptr, 0); - if (nRequiredLen <= 0) { + int required_len; + { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; + required_len = info_->FFI_GetLanguage(info_, nullptr, 0); + } + if (required_len <= 0) { return WideString(); } - DataVector pBuff(nRequiredLen); - int nActualLen = info_->FFI_GetLanguage(info_, pBuff.data(), nRequiredLen); - if (nActualLen <= 0 || nActualLen > nRequiredLen) { + DataVector pBuff(required_len); + int actual_len; + { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; + actual_len = info_->FFI_GetLanguage(info_, pBuff.data(), required_len); + } + if (actual_len <= 0 || actual_len > required_len) { return WideString(); } return WideString::FromUTF16LE( - pdfium::span(pBuff).first(static_cast(nActualLen))); + pdfium::span(pBuff).first(static_cast(actual_len))); #else // PDF_ENABLE_XFA return WideString(); #endif // PDF_ENABLE_XFA @@ -172,19 +186,29 @@ WideString CPDFSDK_FormFillEnvironment::GetPlatform() { return WideString(); } - int nRequiredLen = info_->FFI_GetPlatform(info_, nullptr, 0); - if (nRequiredLen <= 0) { + int required_len; + { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; + required_len = info_->FFI_GetPlatform(info_, nullptr, 0); + } + if (required_len <= 0) { return WideString(); } - DataVector pBuff(nRequiredLen); - int nActualLen = info_->FFI_GetPlatform(info_, pBuff.data(), nRequiredLen); - if (nActualLen <= 0 || nActualLen > nRequiredLen) { + DataVector pBuff(required_len); + int actual_len; + { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; + actual_len = info_->FFI_GetPlatform(info_, pBuff.data(), required_len); + } + if (actual_len <= 0 || actual_len > required_len) { return WideString(); } return WideString::FromUTF16LE( - pdfium::span(pBuff).first(static_cast(nActualLen))); + pdfium::span(pBuff).first(static_cast(actual_len))); #else // PDF_ENABLE_XFA return WideString(); #endif // PDF_ENABLE_XFA @@ -242,20 +266,20 @@ WideString CPDFSDK_FormFillEnvironment::JS_fieldBrowse() { return WideString(); } - const int nRequiredLen = js_platform->Field_browse(js_platform, nullptr, 0); - if (nRequiredLen <= 0) { + const int required_len = js_platform->Field_browse(js_platform, nullptr, 0); + if (required_len <= 0) { return WideString(); } - DataVector pBuff(nRequiredLen); - const int nActualLen = - js_platform->Field_browse(js_platform, pBuff.data(), nRequiredLen); - if (nActualLen <= 0 || nActualLen > nRequiredLen) { + DataVector pBuff(required_len); + const int actual_len = + js_platform->Field_browse(js_platform, pBuff.data(), required_len); + if (actual_len <= 0 || actual_len > required_len) { return WideString(); } // Don't include trailing NUL. - pBuff.resize(nActualLen - 1); + pBuff.resize(actual_len - 1); // Use FromDefANSI() per "local encoding" comment in fpdf_formfill.h. return WideString::FromDefANSI(ByteStringView(pBuff)); @@ -323,21 +347,21 @@ WideString CPDFSDK_FormFillEnvironment::GetFilePath() const { return WideString(); } - const int nRequiredLen = + const int required_len = js_platform->Doc_getFilePath(js_platform, nullptr, 0); - if (nRequiredLen <= 0) { + if (required_len <= 0) { return WideString(); } - DataVector pBuff(nRequiredLen); - const int nActualLen = - js_platform->Doc_getFilePath(js_platform, pBuff.data(), nRequiredLen); - if (nActualLen <= 0 || nActualLen > nRequiredLen) { + DataVector pBuff(required_len); + const int actual_len = + js_platform->Doc_getFilePath(js_platform, pBuff.data(), required_len); + if (actual_len <= 0 || actual_len > required_len) { return WideString(); } // Don't include trailing NUL. - pBuff.resize(nActualLen - 1); + pBuff.resize(actual_len - 1); // Use FromDefANSI() per "local encoding" comment in fpdf_formfill.h. return WideString::FromDefANSI(ByteStringView(pBuff)); @@ -378,7 +402,7 @@ IJS_Runtime* CPDFSDK_FormFillEnvironment::GetIJSRuntime() { void CPDFSDK_FormFillEnvironment::Invalidate(IPDF_Page* page, const FX_RECT& rect) { if (info_ && info_->FFI_Invalidate) { - AutoRestorer ffi_restorer(&in_passive_ffi_callback_); + AutoRestorer restorer(&in_passive_ffi_callback_); in_passive_ffi_callback_ = true; info_->FFI_Invalidate(info_, FPDFPageFromIPDFPage(page), rect.left, rect.top, rect.right, rect.bottom); @@ -388,7 +412,7 @@ void CPDFSDK_FormFillEnvironment::Invalidate(IPDF_Page* page, void CPDFSDK_FormFillEnvironment::SetCursor( IPWL_FillerNotify::CursorStyle nCursorType) { if (info_ && info_->FFI_SetCursor) { - AutoRestorer ffi_restorer(&in_passive_ffi_callback_); + AutoRestorer restorer(&in_passive_ffi_callback_); in_passive_ffi_callback_ = true; info_->FFI_SetCursor(info_, static_cast(nCursorType)); } @@ -397,6 +421,8 @@ void CPDFSDK_FormFillEnvironment::SetCursor( int CPDFSDK_FormFillEnvironment::SetTimer(int uElapse, TimerCallback lpTimerFunc) { if (info_ && info_->FFI_SetTimer) { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; return info_->FFI_SetTimer(info_, uElapse, lpTimerFunc); } return CFX_Timer::HandlerIface::kInvalidTimerID; @@ -404,13 +430,15 @@ int CPDFSDK_FormFillEnvironment::SetTimer(int uElapse, void CPDFSDK_FormFillEnvironment::KillTimer(int nTimerID) { if (info_ && info_->FFI_KillTimer) { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; info_->FFI_KillTimer(info_, nTimerID); } } void CPDFSDK_FormFillEnvironment::OnChange() { if (info_ && info_->FFI_OnChange) { - AutoRestorer ffi_restorer(&in_passive_ffi_callback_); + AutoRestorer restorer(&in_passive_ffi_callback_); in_passive_ffi_callback_ = true; info_->FFI_OnChange(info_); } @@ -419,6 +447,8 @@ void CPDFSDK_FormFillEnvironment::OnChange() { void CPDFSDK_FormFillEnvironment::ExecuteNamedAction( const ByteString& namedAction) { if (info_ && info_->FFI_ExecuteNamedAction) { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; info_->FFI_ExecuteNamedAction(info_, namedAction.c_str()); } } @@ -434,7 +464,7 @@ void CPDFSDK_FormFillEnvironment::OnSetFieldInputFocusInternal( size_t nCharacters = text.GetLength(); ByteString bsUTFText = text.ToUTF16LE(); auto* pBuffer = reinterpret_cast(bsUTFText.c_str()); - AutoRestorer ffi_restorer(&in_passive_ffi_callback_); + AutoRestorer restorer(&in_passive_ffi_callback_); in_passive_ffi_callback_ = true; info_->FFI_SetTextFieldFocus( info_, pBuffer, pdfium::checked_cast(nCharacters), bFocus); @@ -471,14 +501,16 @@ void CPDFSDK_FormFillEnvironment::DoURIAction(const ByteString& bsURI, if (!info_) { return; } - if (info_->version >= 2 && info_->FFI_DoURIActionWithKeyboardModifier) { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; info_->FFI_DoURIActionWithKeyboardModifier(info_, bsURI.c_str(), modifiers.UncheckedValue()); return; } - if (info_->FFI_DoURIAction) { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; info_->FFI_DoURIAction(info_, bsURI.c_str()); } } @@ -487,6 +519,8 @@ void CPDFSDK_FormFillEnvironment::DoGoToAction(int nPageIndex, int zoomMode, pdfium::span fPosArray) { if (info_ && info_->FFI_DoGoToAction) { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; info_->FFI_DoGoToAction(info_, nPageIndex, zoomMode, fPosArray.data(), fxcrt::CollectionSize(fPosArray)); } @@ -504,17 +538,19 @@ void CPDFSDK_FormFillEnvironment::DisplayCaret(IPDF_Page* page, double right, double bottom) { if (info_ && info_->version >= 2 && info_->FFI_DisplayCaret) { - AutoRestorer ffi_restorer(&in_passive_ffi_callback_); + AutoRestorer restorer(&in_passive_ffi_callback_); in_passive_ffi_callback_ = true; info_->FFI_DisplayCaret(info_, FPDFPageFromIPDFPage(page), bVisible, left, top, right, bottom); } } -int CPDFSDK_FormFillEnvironment::GetCurrentPageIndex() const { +int CPDFSDK_FormFillEnvironment::GetCurrentPageIndex() { if (!info_ || info_->version < 2 || !info_->FFI_GetCurrentPageIndex) { return -1; } + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; return info_->FFI_GetCurrentPageIndex( info_, FPDFDocumentFromCPDFDocument(cpdfdoc_.Get())); } @@ -523,6 +559,8 @@ void CPDFSDK_FormFillEnvironment::SetCurrentPage(int iCurPage) { if (!info_ || info_->version < 2 || !info_->FFI_SetCurrentPage) { return; } + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; info_->FFI_SetCurrentPage(info_, FPDFDocumentFromCPDFDocument(cpdfdoc_.Get()), iCurPage); } @@ -533,6 +571,8 @@ void CPDFSDK_FormFillEnvironment::GotoURL(const WideString& wsURL) { } ByteString bsTo = wsURL.ToUTF16LE(); + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; info_->FFI_GotoURL(info_, FPDFDocumentFromCPDFDocument(cpdfdoc_.Get()), AsFPDFWideString(&bsTo)); } @@ -547,8 +587,12 @@ FS_RECTF CPDFSDK_FormFillEnvironment::GetPageViewRect(IPDF_Page* page) { double top; double right; double bottom; - info_->FFI_GetPageViewRect(info_, FPDFPageFromIPDFPage(page), &left, &top, - &right, &bottom); + { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; + info_->FFI_GetPageViewRect(info_, FPDFPageFromIPDFPage(page), &left, &top, + &right, &bottom); + } rect.left = static_cast(left); rect.top = static_cast(top); @@ -560,9 +604,13 @@ FS_RECTF CPDFSDK_FormFillEnvironment::GetPageViewRect(IPDF_Page* page) { bool CPDFSDK_FormFillEnvironment::PopupMenu(IPDF_Page* page, int menuFlag, const CFX_PointF& pt) { - return info_ && info_->version >= 2 && info_->FFI_PopupMenu && - info_->FFI_PopupMenu(info_, FPDFPageFromIPDFPage(page), nullptr, - menuFlag, pt.x, pt.y); + if (info_ && info_->version >= 2 && info_->FFI_PopupMenu) { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; + return info_->FFI_PopupMenu(info_, FPDFPageFromIPDFPage(page), nullptr, + menuFlag, pt.x, pt.y); + } + return false; } void CPDFSDK_FormFillEnvironment::EmailTo(FPDF_FILEHANDLER* fileHandler, @@ -572,6 +620,8 @@ void CPDFSDK_FormFillEnvironment::EmailTo(FPDF_FILEHANDLER* fileHandler, FPDF_WIDESTRING pBcc, FPDF_WIDESTRING pMsg) { if (info_ && info_->version >= 2 && info_->FFI_EmailTo) { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; info_->FFI_EmailTo(info_, fileHandler, pTo, pSubject, pCC, pBcc, pMsg); } } @@ -580,6 +630,8 @@ void CPDFSDK_FormFillEnvironment::UploadTo(FPDF_FILEHANDLER* fileHandler, int fileFlag, FPDF_WIDESTRING uploadTo) { if (info_ && info_->version >= 2 && info_->FFI_UploadTo) { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; info_->FFI_UploadTo(info_, fileHandler, fileFlag, uploadTo); } } @@ -588,6 +640,8 @@ FPDF_FILEHANDLER* CPDFSDK_FormFillEnvironment::OpenFile(int fileType, FPDF_WIDESTRING wsURL, const char* mode) { if (info_ && info_->version >= 2 && info_->FFI_OpenFile) { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; return info_->FFI_OpenFile(info_, fileType, wsURL, mode); } return nullptr; @@ -600,8 +654,13 @@ RetainPtr CPDFSDK_FormFillEnvironment::DownloadFromURL( } ByteString bstrURL = url.ToUTF16LE(); - FPDF_FILEHANDLER* file_handler = - info_->FFI_DownloadFromURL(info_, AsFPDFWideString(&bstrURL)); + FPDF_FILEHANDLER* file_handler; + { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; + file_handler = + info_->FFI_DownloadFromURL(info_, AsFPDFWideString(&bstrURL)); + } if (!file_handler) { return nullptr; } @@ -627,10 +686,14 @@ WideString CPDFSDK_FormFillEnvironment::PostRequestURL( FPDF_BSTR response; FPDF_BStr_Init(&response); - info_->FFI_PostRequestURL( - info_, AsFPDFWideString(&bsURL), AsFPDFWideString(&bsData), - AsFPDFWideString(&bsContentType), AsFPDFWideString(&bsEncode), - AsFPDFWideString(&bsHeader), &response); + { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; + info_->FFI_PostRequestURL( + info_, AsFPDFWideString(&bsURL), AsFPDFWideString(&bsData), + AsFPDFWideString(&bsContentType), AsFPDFWideString(&bsEncode), + AsFPDFWideString(&bsHeader), &response); + } // SAFETY: required from FFI callback. WideString wsRet = WideString::FromUTF16LE(UNSAFE_BUFFERS( @@ -653,14 +716,18 @@ FPDF_BOOL CPDFSDK_FormFillEnvironment::PutRequestURL( ByteString bsData = wsData.ToUTF16LE(); ByteString bsEncode = wsEncode.ToUTF16LE(); + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; return info_->FFI_PutRequestURL(info_, AsFPDFWideString(&bsURL), AsFPDFWideString(&bsData), AsFPDFWideString(&bsEncode)); } void CPDFSDK_FormFillEnvironment::PageEvent(int iPageCount, - uint32_t dwEventType) const { + uint32_t dwEventType) { if (info_ && info_->version >= 2 && info_->FFI_PageEvent) { + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; info_->FFI_PageEvent(info_, iPageCount, dwEventType); } } @@ -790,10 +857,12 @@ void CPDFSDK_FormFillEnvironment::RemovePageView(IPDF_Page* pUnderlyingPage) { page_map_.erase(it); } -IPDF_Page* CPDFSDK_FormFillEnvironment::GetPage(int nIndex) const { +IPDF_Page* CPDFSDK_FormFillEnvironment::GetPage(int nIndex) { if (!info_ || !info_->FFI_GetPage) { return nullptr; } + AutoRestorer restorer(&in_active_ffi_callback_); + in_active_ffi_callback_ = true; return IPDFPageFromFPDFPage(info_->FFI_GetPage( info_, FPDFDocumentFromCPDFDocument(cpdfdoc_.Get()), nIndex)); } @@ -934,7 +1003,7 @@ void CPDFSDK_FormFillEnvironment::SendOnFocusChange( FPDF_ANNOTATION fpdf_annot = FPDFAnnotationFromCPDFAnnotContext(focused_annot.get()); - AutoRestorer ffi_restorer(&in_passive_ffi_callback_); + AutoRestorer restorer(&in_passive_ffi_callback_); in_passive_ffi_callback_ = true; info_->FFI_OnFocusChange(info_, fpdf_annot, pPageView->GetPageIndex()); } diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.h b/fpdfsdk/cpdfsdk_formfillenvironment.h index 5ddd521541..a25cc62877 100644 --- a/fpdfsdk/cpdfsdk_formfillenvironment.h +++ b/fpdfsdk/cpdfsdk_formfillenvironment.h @@ -158,7 +158,7 @@ class CPDFSDK_FormFillEnvironment final #ifdef PDF_ENABLE_V8 CPDFSDK_PageView* GetCurrentView(); - IPDF_Page* GetCurrentPage() const; + IPDF_Page* GetCurrentPage(); WideString GetLanguage(); WideString GetPlatform(); @@ -201,7 +201,7 @@ class CPDFSDK_FormFillEnvironment final double top, double right, double bottom); - int GetCurrentPageIndex() const; + int GetCurrentPageIndex(); void SetCurrentPage(int iCurPage); // TODO(dsinclair): This should probably change to PDFium? @@ -232,7 +232,7 @@ class CPDFSDK_FormFillEnvironment final const WideString& wsData, const WideString& wsEncode); - void PageEvent(int iPageCount, uint32_t dwEventType) const; + void PageEvent(int iPageCount, uint32_t dwEventType); #endif // PDF_ENABLE_XFA #endif // PDF_ENABLE_V8 @@ -259,7 +259,7 @@ class CPDFSDK_FormFillEnvironment final private: using RunScriptCallback = std::function; - IPDF_Page* GetPage(int nIndex) const; + IPDF_Page* GetPage(int nIndex); void OnSetFieldInputFocusInternal(const WideString& text, bool bFocus); void SendOnFocusChange(ObservedPtr& pAnnot); @@ -299,6 +299,7 @@ class CPDFSDK_FormFillEnvironment final std::unique_ptr interactive_form_filler_; bool change_mask_ = false; bool being_destroyed_ = false; + bool in_active_ffi_callback_ = false; bool in_passive_ffi_callback_ = false; // Holds the list of focusable annot types. From 3ea7ec1feb70ee2d7b64ea857074aac06cfae156 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Wed, 14 Oct 2026 11:26:45 -0700 Subject: [PATCH 26/37] Introduce two-argument AutoRestorer constructor. Provide a new value at construction time. Then use this to simplify CPDFSDK_FormFillEnvironment. Change-Id: Iadc1af0ae0e22f441380565219a814b7b56b080f Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160910 Commit-Queue: Tom Sepez Reviewed-by: Lei Zhang --- core/fxcrt/autorestorer.h | 7 ++ core/fxcrt/autorestorer_unittest.cpp | 8 ++- fpdfsdk/cpdfsdk_formfillenvironment.cpp | 93 +++++++++---------------- 3 files changed, 44 insertions(+), 64 deletions(-) diff --git a/core/fxcrt/autorestorer.h b/core/fxcrt/autorestorer.h index 6f19c2acd8..367b9bf825 100644 --- a/core/fxcrt/autorestorer.h +++ b/core/fxcrt/autorestorer.h @@ -17,11 +17,18 @@ class AutoRestorer { explicit AutoRestorer(T* location) : location_(location), old_value_(*location) {} + + AutoRestorer(T* location, const T& new_value) + : location_(location), old_value_(*location) { + *location = new_value; + } + ~AutoRestorer() { if (location_) { *location_ = old_value_; } } + void AbandonRestoration() { location_ = nullptr; } private: diff --git a/core/fxcrt/autorestorer_unittest.cpp b/core/fxcrt/autorestorer_unittest.cpp index b7ee576afe..dfa6e849e7 100644 --- a/core/fxcrt/autorestorer_unittest.cpp +++ b/core/fxcrt/autorestorer_unittest.cpp @@ -16,6 +16,11 @@ TEST(fxcrt, AutoRestorer) { EXPECT_EQ(6, x); } EXPECT_EQ(5, x); + { + AutoRestorer restorer(&x, 7); + EXPECT_EQ(7, x); + } + EXPECT_EQ(5, x); } TEST(fxcrt, AutoRestorerNoOp) { @@ -30,8 +35,7 @@ TEST(fxcrt, AutoRestorerNoOp) { TEST(fxcrt, AutoRestorerAbandon) { int x = 5; { - AutoRestorer restorer(&x); - x = 6; + AutoRestorer restorer(&x, 6); EXPECT_EQ(6, x); restorer.AbandonRestoration(); } diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp index c882bfd82c..93e07e0057 100644 --- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp +++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp @@ -121,8 +121,7 @@ void CPDFSDK_FormFillEnvironment::OutputSelectedRect( CFX_PointF ptA = pFormField->PWLtoFFL(CFX_PointF(rect.left, rect.bottom)); CFX_PointF ptB = pFormField->PWLtoFFL(CFX_PointF(rect.right, rect.top)); - AutoRestorer restorer(&in_passive_ffi_callback_); - in_passive_ffi_callback_ = true; + AutoRestorer restorer(&in_passive_ffi_callback_, true); info_->FFI_OutputSelectedRect(info_, pPage, ptA.x, ptB.y, ptB.x, ptA.y); } @@ -138,8 +137,7 @@ CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetCurrentView() { IPDF_Page* CPDFSDK_FormFillEnvironment::GetCurrentPage() { if (info_ && info_->FFI_GetCurrentPage) { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); return IPDFPageFromFPDFPage(info_->FFI_GetCurrentPage( info_, FPDFDocumentFromCPDFDocument(cpdfdoc_.Get()))); } @@ -154,8 +152,7 @@ WideString CPDFSDK_FormFillEnvironment::GetLanguage() { int required_len; { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); required_len = info_->FFI_GetLanguage(info_, nullptr, 0); } if (required_len <= 0) { @@ -165,8 +162,7 @@ WideString CPDFSDK_FormFillEnvironment::GetLanguage() { DataVector pBuff(required_len); int actual_len; { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); actual_len = info_->FFI_GetLanguage(info_, pBuff.data(), required_len); } if (actual_len <= 0 || actual_len > required_len) { @@ -188,8 +184,7 @@ WideString CPDFSDK_FormFillEnvironment::GetPlatform() { int required_len; { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); required_len = info_->FFI_GetPlatform(info_, nullptr, 0); } if (required_len <= 0) { @@ -199,8 +194,7 @@ WideString CPDFSDK_FormFillEnvironment::GetPlatform() { DataVector pBuff(required_len); int actual_len; { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); actual_len = info_->FFI_GetPlatform(info_, pBuff.data(), required_len); } if (actual_len <= 0 || actual_len > required_len) { @@ -402,8 +396,7 @@ IJS_Runtime* CPDFSDK_FormFillEnvironment::GetIJSRuntime() { void CPDFSDK_FormFillEnvironment::Invalidate(IPDF_Page* page, const FX_RECT& rect) { if (info_ && info_->FFI_Invalidate) { - AutoRestorer restorer(&in_passive_ffi_callback_); - in_passive_ffi_callback_ = true; + AutoRestorer restorer(&in_passive_ffi_callback_, true); info_->FFI_Invalidate(info_, FPDFPageFromIPDFPage(page), rect.left, rect.top, rect.right, rect.bottom); } @@ -412,8 +405,7 @@ void CPDFSDK_FormFillEnvironment::Invalidate(IPDF_Page* page, void CPDFSDK_FormFillEnvironment::SetCursor( IPWL_FillerNotify::CursorStyle nCursorType) { if (info_ && info_->FFI_SetCursor) { - AutoRestorer restorer(&in_passive_ffi_callback_); - in_passive_ffi_callback_ = true; + AutoRestorer restorer(&in_passive_ffi_callback_, true); info_->FFI_SetCursor(info_, static_cast(nCursorType)); } } @@ -421,8 +413,7 @@ void CPDFSDK_FormFillEnvironment::SetCursor( int CPDFSDK_FormFillEnvironment::SetTimer(int uElapse, TimerCallback lpTimerFunc) { if (info_ && info_->FFI_SetTimer) { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); return info_->FFI_SetTimer(info_, uElapse, lpTimerFunc); } return CFX_Timer::HandlerIface::kInvalidTimerID; @@ -430,16 +421,14 @@ int CPDFSDK_FormFillEnvironment::SetTimer(int uElapse, void CPDFSDK_FormFillEnvironment::KillTimer(int nTimerID) { if (info_ && info_->FFI_KillTimer) { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); info_->FFI_KillTimer(info_, nTimerID); } } void CPDFSDK_FormFillEnvironment::OnChange() { if (info_ && info_->FFI_OnChange) { - AutoRestorer restorer(&in_passive_ffi_callback_); - in_passive_ffi_callback_ = true; + AutoRestorer restorer(&in_passive_ffi_callback_, true); info_->FFI_OnChange(info_); } } @@ -447,8 +436,7 @@ void CPDFSDK_FormFillEnvironment::OnChange() { void CPDFSDK_FormFillEnvironment::ExecuteNamedAction( const ByteString& namedAction) { if (info_ && info_->FFI_ExecuteNamedAction) { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); info_->FFI_ExecuteNamedAction(info_, namedAction.c_str()); } } @@ -464,8 +452,7 @@ void CPDFSDK_FormFillEnvironment::OnSetFieldInputFocusInternal( size_t nCharacters = text.GetLength(); ByteString bsUTFText = text.ToUTF16LE(); auto* pBuffer = reinterpret_cast(bsUTFText.c_str()); - AutoRestorer restorer(&in_passive_ffi_callback_); - in_passive_ffi_callback_ = true; + AutoRestorer restorer(&in_passive_ffi_callback_, true); info_->FFI_SetTextFieldFocus( info_, pBuffer, pdfium::checked_cast(nCharacters), bFocus); } @@ -502,15 +489,13 @@ void CPDFSDK_FormFillEnvironment::DoURIAction(const ByteString& bsURI, return; } if (info_->version >= 2 && info_->FFI_DoURIActionWithKeyboardModifier) { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); info_->FFI_DoURIActionWithKeyboardModifier(info_, bsURI.c_str(), modifiers.UncheckedValue()); return; } if (info_->FFI_DoURIAction) { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); info_->FFI_DoURIAction(info_, bsURI.c_str()); } } @@ -519,8 +504,7 @@ void CPDFSDK_FormFillEnvironment::DoGoToAction(int nPageIndex, int zoomMode, pdfium::span fPosArray) { if (info_ && info_->FFI_DoGoToAction) { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); info_->FFI_DoGoToAction(info_, nPageIndex, zoomMode, fPosArray.data(), fxcrt::CollectionSize(fPosArray)); } @@ -538,8 +522,7 @@ void CPDFSDK_FormFillEnvironment::DisplayCaret(IPDF_Page* page, double right, double bottom) { if (info_ && info_->version >= 2 && info_->FFI_DisplayCaret) { - AutoRestorer restorer(&in_passive_ffi_callback_); - in_passive_ffi_callback_ = true; + AutoRestorer restorer(&in_passive_ffi_callback_, true); info_->FFI_DisplayCaret(info_, FPDFPageFromIPDFPage(page), bVisible, left, top, right, bottom); } @@ -549,8 +532,7 @@ int CPDFSDK_FormFillEnvironment::GetCurrentPageIndex() { if (!info_ || info_->version < 2 || !info_->FFI_GetCurrentPageIndex) { return -1; } - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); return info_->FFI_GetCurrentPageIndex( info_, FPDFDocumentFromCPDFDocument(cpdfdoc_.Get())); } @@ -559,8 +541,7 @@ void CPDFSDK_FormFillEnvironment::SetCurrentPage(int iCurPage) { if (!info_ || info_->version < 2 || !info_->FFI_SetCurrentPage) { return; } - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); info_->FFI_SetCurrentPage(info_, FPDFDocumentFromCPDFDocument(cpdfdoc_.Get()), iCurPage); } @@ -571,8 +552,7 @@ void CPDFSDK_FormFillEnvironment::GotoURL(const WideString& wsURL) { } ByteString bsTo = wsURL.ToUTF16LE(); - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); info_->FFI_GotoURL(info_, FPDFDocumentFromCPDFDocument(cpdfdoc_.Get()), AsFPDFWideString(&bsTo)); } @@ -588,8 +568,7 @@ FS_RECTF CPDFSDK_FormFillEnvironment::GetPageViewRect(IPDF_Page* page) { double right; double bottom; { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); info_->FFI_GetPageViewRect(info_, FPDFPageFromIPDFPage(page), &left, &top, &right, &bottom); } @@ -605,8 +584,7 @@ bool CPDFSDK_FormFillEnvironment::PopupMenu(IPDF_Page* page, int menuFlag, const CFX_PointF& pt) { if (info_ && info_->version >= 2 && info_->FFI_PopupMenu) { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); return info_->FFI_PopupMenu(info_, FPDFPageFromIPDFPage(page), nullptr, menuFlag, pt.x, pt.y); } @@ -620,8 +598,7 @@ void CPDFSDK_FormFillEnvironment::EmailTo(FPDF_FILEHANDLER* fileHandler, FPDF_WIDESTRING pBcc, FPDF_WIDESTRING pMsg) { if (info_ && info_->version >= 2 && info_->FFI_EmailTo) { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); info_->FFI_EmailTo(info_, fileHandler, pTo, pSubject, pCC, pBcc, pMsg); } } @@ -630,8 +607,7 @@ void CPDFSDK_FormFillEnvironment::UploadTo(FPDF_FILEHANDLER* fileHandler, int fileFlag, FPDF_WIDESTRING uploadTo) { if (info_ && info_->version >= 2 && info_->FFI_UploadTo) { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); info_->FFI_UploadTo(info_, fileHandler, fileFlag, uploadTo); } } @@ -640,8 +616,7 @@ FPDF_FILEHANDLER* CPDFSDK_FormFillEnvironment::OpenFile(int fileType, FPDF_WIDESTRING wsURL, const char* mode) { if (info_ && info_->version >= 2 && info_->FFI_OpenFile) { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); return info_->FFI_OpenFile(info_, fileType, wsURL, mode); } return nullptr; @@ -656,8 +631,7 @@ RetainPtr CPDFSDK_FormFillEnvironment::DownloadFromURL( ByteString bstrURL = url.ToUTF16LE(); FPDF_FILEHANDLER* file_handler; { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); file_handler = info_->FFI_DownloadFromURL(info_, AsFPDFWideString(&bstrURL)); } @@ -687,8 +661,7 @@ WideString CPDFSDK_FormFillEnvironment::PostRequestURL( FPDF_BSTR response; FPDF_BStr_Init(&response); { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); info_->FFI_PostRequestURL( info_, AsFPDFWideString(&bsURL), AsFPDFWideString(&bsData), AsFPDFWideString(&bsContentType), AsFPDFWideString(&bsEncode), @@ -716,8 +689,7 @@ FPDF_BOOL CPDFSDK_FormFillEnvironment::PutRequestURL( ByteString bsData = wsData.ToUTF16LE(); ByteString bsEncode = wsEncode.ToUTF16LE(); - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); return info_->FFI_PutRequestURL(info_, AsFPDFWideString(&bsURL), AsFPDFWideString(&bsData), AsFPDFWideString(&bsEncode)); @@ -726,8 +698,7 @@ FPDF_BOOL CPDFSDK_FormFillEnvironment::PutRequestURL( void CPDFSDK_FormFillEnvironment::PageEvent(int iPageCount, uint32_t dwEventType) { if (info_ && info_->version >= 2 && info_->FFI_PageEvent) { - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); info_->FFI_PageEvent(info_, iPageCount, dwEventType); } } @@ -861,8 +832,7 @@ IPDF_Page* CPDFSDK_FormFillEnvironment::GetPage(int nIndex) { if (!info_ || !info_->FFI_GetPage) { return nullptr; } - AutoRestorer restorer(&in_active_ffi_callback_); - in_active_ffi_callback_ = true; + AutoRestorer restorer(&in_active_ffi_callback_, true); return IPDFPageFromFPDFPage(info_->FFI_GetPage( info_, FPDFDocumentFromCPDFDocument(cpdfdoc_.Get()), nIndex)); } @@ -1003,8 +973,7 @@ void CPDFSDK_FormFillEnvironment::SendOnFocusChange( FPDF_ANNOTATION fpdf_annot = FPDFAnnotationFromCPDFAnnotContext(focused_annot.get()); - AutoRestorer restorer(&in_passive_ffi_callback_); - in_passive_ffi_callback_ = true; + AutoRestorer restorer(&in_passive_ffi_callback_, true); info_->FFI_OnFocusChange(info_, fpdf_annot, pPageView->GetPageIndex()); } From 1276841e4a0174f80f9e98f6154544fb9277b2fa Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 14 Oct 2026 12:20:09 -0700 Subject: [PATCH 27/37] Stop trying to clang-format //third_party code Add third_party/.clang-format-ignore so clang-format does not format 3P code. It is copied from Chromium's file at the same relative location. Change-Id: I4903da2517c409a10859d8a039642612f07cce9c Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160930 Reviewed-by: Andy Phan Commit-Queue: Lei Zhang --- third_party/.clang-format-ignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 third_party/.clang-format-ignore diff --git a/third_party/.clang-format-ignore b/third_party/.clang-format-ignore new file mode 100644 index 0000000000..c3fc01cef3 --- /dev/null +++ b/third_party/.clang-format-ignore @@ -0,0 +1,5 @@ +# Ignore all vendored third-party code. If any first-party code need to be +# formatted, please put a config under your own directory to void this one. +# https://clang.llvm.org/docs/ClangFormat.html#clang-format-ignore + +** From f536928c24659ca3f669327b83b0af6e7cfb3826 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Wed, 14 Oct 2026 12:37:16 -0700 Subject: [PATCH 28/37] Use two-argument AutoRestorer constructor in additional files. Simplify the cases where assigning a bool, enum, or integer literal. Change-Id: I3fc7104a819f232e668aa92704c145a5e9dc6fd9 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160911 Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- core/fpdfapi/parser/cpdf_parser.cpp | 3 +- core/fpdfapi/parser/cpdf_syntax_parser.cpp | 3 +- core/fxcrt/xml/cfx_xmlparser.cpp | 4 +- fpdfsdk/cpdfsdk_interactiveform.cpp | 4 +- fpdfsdk/cpdfsdk_pageview.cpp | 3 +- .../formfiller/cffl_interactiveformfiller.cpp | 61 +++++++------------ fpdfsdk/pwl/cpwl_edit_impl.cpp | 20 +++--- fxjs/cjs_event_context.cpp | 3 +- fxjs/xfa/cfxjse_engine.cpp | 8 +-- 9 files changed, 38 insertions(+), 71 deletions(-) diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp index 025b184cc9..aa5669652a 100644 --- a/core/fpdfapi/parser/cpdf_parser.cpp +++ b/core/fpdfapi/parser/cpdf_parser.cpp @@ -1328,8 +1328,7 @@ CPDF_Parser::Error CPDF_Parser::LoadLinearizedMainXRefTable() { return SUCCESS; } - const AutoRestorer save_metadata_objnum(&metadata_objnum_); - metadata_objnum_ = 0; + AutoRestorer save_metadata_objnum(&metadata_objnum_, 0); object_stream_map_.clear(); if (!LoadLinearizedAllCrossRefTable(main_xref_offset) && diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp index 0b256a34be..01246ba95a 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp +++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp @@ -105,8 +105,7 @@ CPDF_SyntaxParser::CPDF_SyntaxParser(RetainPtr validator, CPDF_SyntaxParser::~CPDF_SyntaxParser() = default; bool CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, uint8_t& ch) { - AutoRestorer save_pos(&pos_); - pos_ = pos; + AutoRestorer save_pos(&pos_, pos); return GetNextChar(ch); } diff --git a/core/fxcrt/xml/cfx_xmlparser.cpp b/core/fxcrt/xml/cfx_xmlparser.cpp index c516cc1946..3cb59c3011 100644 --- a/core/fxcrt/xml/cfx_xmlparser.cpp +++ b/core/fxcrt/xml/cfx_xmlparser.cpp @@ -85,8 +85,8 @@ CFX_XMLParser::~CFX_XMLParser() = default; std::unique_ptr CFX_XMLParser::Parse() { auto doc = std::make_unique(); - AutoRestorer> restorer(¤t_node_); - current_node_ = doc->GetRoot(); + AutoRestorer> restorer(¤t_node_, + doc->GetRoot()); if (!DoSyntaxParse(doc.get())) { return nullptr; } diff --git a/fpdfsdk/cpdfsdk_interactiveform.cpp b/fpdfsdk/cpdfsdk_interactiveform.cpp index 41dcf0b89e..f4543117b8 100644 --- a/fpdfsdk/cpdfsdk_interactiveform.cpp +++ b/fpdfsdk/cpdfsdk_interactiveform.cpp @@ -260,9 +260,7 @@ void CPDFSDK_InteractiveForm::OnCalculate(CPDF_FormField* pFormField) { return; } - AutoRestorer restorer(&busy_); - busy_ = true; - + AutoRestorer restorer(&busy_, true); if (!IsCalculateEnabled()) { return; } diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp index 339201caec..445811d299 100644 --- a/fpdfsdk/cpdfsdk_pageview.cpp +++ b/fpdfsdk/cpdfsdk_pageview.cpp @@ -570,8 +570,7 @@ bool CPDFSDK_PageView::OnKeyDown(FWL_VKEYCODE key_code, } void CPDFSDK_PageView::LoadFXAnnots() { - AutoRestorer lock(&locked_); - locked_ = true; + AutoRestorer lock(&locked_, true); #ifdef PDF_ENABLE_XFA RetainPtr protector(ToXFAPage(page_)); diff --git a/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp b/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp index b041ff7e58..b2e521141e 100644 --- a/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp +++ b/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp @@ -108,12 +108,11 @@ void CFFL_InteractiveFormFiller::OnMouseEnter( pWidget->set_appearance_modified(false); DCHECK(pPageView); { - AutoRestorer restorer(¬ifying_); - notifying_ = true; - CFFL_FieldAction fa; fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); + + AutoRestorer restorer(¬ifying_, true); pWidget->OnAAction(CPDF_AAction::kCursorEnter, &fa, pPageView); } if (!pWidget) { @@ -144,12 +143,11 @@ void CFFL_InteractiveFormFiller::OnMouseExit( pWidget->set_appearance_modified(false); DCHECK(pPageView); { - AutoRestorer restorer(¬ifying_); - notifying_ = true; - CFFL_FieldAction fa; fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); + + AutoRestorer restorer(¬ifying_, true); pWidget->OnAAction(CPDF_AAction::kCursorExit, &fa, pPageView); } if (!pWidget) { @@ -182,12 +180,11 @@ bool CFFL_InteractiveFormFiller::OnLButtonDown( pWidget->set_appearance_modified(false); DCHECK(pPageView); { - AutoRestorer restorer(¬ifying_); - notifying_ = true; - CFFL_FieldAction fa; fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlags); fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlags); + + AutoRestorer restorer(¬ifying_, true); pWidget->OnAAction(CPDF_AAction::kButtonDown, &fa, pPageView); } if (!pWidget) { @@ -269,12 +266,11 @@ bool CFFL_InteractiveFormFiller::OnButtonUp( uint32_t nValueAge = pWidget->GetValueAge(); DCHECK(pPageView); { - AutoRestorer restorer(¬ifying_); - notifying_ = true; - CFFL_FieldAction fa; fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); + + AutoRestorer restorer(¬ifying_, true); pWidget->OnAAction(CPDF_AAction::kButtonUp, &fa, pPageView); } if (!pWidget || !IsValidAnnot(pPageView, pWidget.Get())) { @@ -410,12 +406,11 @@ bool CFFL_InteractiveFormFiller::OnSetFocus( CPDFSDK_PageView* pPageView = pWidget->GetPageView(); DCHECK(pPageView); { - AutoRestorer restorer(¬ifying_); - notifying_ = true; - CFFL_FieldAction fa; fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); + + AutoRestorer restorer(¬ifying_, true); pFormField->GetActionData(pPageView, CPDF_AAction::kGetFocus, fa); pWidget->OnAAction(CPDF_AAction::kGetFocus, &fa, pPageView); } @@ -470,12 +465,11 @@ bool CFFL_InteractiveFormFiller::OnKillFocus( CPDFSDK_PageView* pPageView = pWidget->GetPageView(); DCHECK(pPageView); { - AutoRestorer restorer(¬ifying_); - notifying_ = true; - CFFL_FieldAction fa; fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); + + AutoRestorer restorer(¬ifying_, true); pFormField->GetActionData(pPageView, CPDF_AAction::kLoseFocus, fa); pWidget->OnAAction(CPDF_AAction::kLoseFocus, &fa, pPageView); } @@ -743,9 +737,6 @@ bool CFFL_InteractiveFormFiller::OnKeyStrokeCommit( DCHECK(pPageView); pWidget->set_appearance_modified(false); - AutoRestorer restorer(¬ifying_); - notifying_ = true; - CFFL_FieldAction fa; fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); @@ -753,6 +744,7 @@ bool CFFL_InteractiveFormFiller::OnKeyStrokeCommit( fa.bKeyDown = true; fa.bRC = true; + AutoRestorer restorer(¬ifying_, true); CFFL_FormField* pFormField = GetFormField(pWidget.Get()); pFormField->GetActionData(pPageView, CPDF_AAction::kKeyStroke, fa); pFormField->SavePWLWindowState(pPageView); @@ -780,15 +772,13 @@ bool CFFL_InteractiveFormFiller::OnValidate( DCHECK(pPageView); pWidget->set_appearance_modified(false); - AutoRestorer restorer(¬ifying_); - notifying_ = true; - CFFL_FieldAction fa; fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); fa.bKeyDown = true; fa.bRC = true; + AutoRestorer restorer(¬ifying_, true); CFFL_FormField* pFormField = GetFormField(pWidget.Get()); pFormField->GetActionData(pPageView, CPDF_AAction::kValidate, fa); pFormField->SavePWLWindowState(pPageView); @@ -836,13 +826,11 @@ bool CFFL_InteractiveFormFiller::OnClick(ObservedPtr& pWidget, uint32_t nAge = pWidget->GetAppearanceAge(); uint32_t nValueAge = pWidget->GetValueAge(); { - AutoRestorer restorer(¬ifying_); - notifying_ = true; - CFFL_FieldAction fa; fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); + AutoRestorer restorer(¬ifying_, true); pWidget->OnXFAAAction(PDFSDK_XFA_Click, &fa, pPageView); } if (!pWidget || !IsValidAnnot(pPageView, pWidget.Get())) { @@ -873,12 +861,11 @@ bool CFFL_InteractiveFormFiller::OnFull(ObservedPtr& pWidget, uint32_t nAge = pWidget->GetAppearanceAge(); uint32_t nValueAge = pWidget->GetValueAge(); { - AutoRestorer restorer(¬ifying_); - notifying_ = true; - CFFL_FieldAction fa; fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); + + AutoRestorer restorer(¬ifying_, true); pWidget->OnXFAAAction(PDFSDK_XFA_Full, &fa, pPageView); } if (!pWidget || !IsValidAnnot(pPageView, pWidget.Get())) { @@ -909,12 +896,11 @@ bool CFFL_InteractiveFormFiller::OnPreOpen(ObservedPtr& pWidget, uint32_t nAge = pWidget->GetAppearanceAge(); uint32_t nValueAge = pWidget->GetValueAge(); { - AutoRestorer restorer(¬ifying_); - notifying_ = true; - CFFL_FieldAction fa; fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); + + AutoRestorer restorer(¬ifying_, true); pWidget->OnXFAAAction(PDFSDK_XFA_PreOpen, &fa, pPageView); } if (!pWidget || !IsValidAnnot(pPageView, pWidget.Get())) { @@ -946,12 +932,11 @@ bool CFFL_InteractiveFormFiller::OnPostOpen( uint32_t nAge = pWidget->GetAppearanceAge(); uint32_t nValueAge = pWidget->GetValueAge(); { - AutoRestorer restorer(¬ifying_); - notifying_ = true; - CFFL_FieldAction fa; fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); + + AutoRestorer restorer(¬ifying_, true); pWidget->OnXFAAAction(PDFSDK_XFA_PostOpen, &fa, pPageView); } if (!pWidget || !IsValidAnnot(pPageView, pWidget.Get())) { @@ -1005,9 +990,7 @@ CFFL_InteractiveFormFiller::OnBeforeKeyStroke( return {true, false}; } - AutoRestorer restorer(¬ifying_); - notifying_ = true; - + AutoRestorer restorer(¬ifying_, true); uint32_t nAge = pWidget->GetAppearanceAge(); uint32_t nValueAge = pWidget->GetValueAge(); diff --git a/fpdfsdk/pwl/cpwl_edit_impl.cpp b/fpdfsdk/pwl/cpwl_edit_impl.cpp index ea7239377b..50437a2e11 100644 --- a/fpdfsdk/pwl/cpwl_edit_impl.cpp +++ b/fpdfsdk/pwl/cpwl_edit_impl.cpp @@ -1147,15 +1147,14 @@ void CPWL_EditImpl::SetScrollInfo() { return; } - AutoRestorer restorer(¬ify_flag_); - notify_flag_ = true; - PWL_SCROLL_INFO Info; Info.fPlateWidth = rcPlate.top - rcPlate.bottom; Info.fContentMin = rcContent.bottom; Info.fContentMax = rcContent.top; Info.fSmallStep = rcPlate.Height() / 3; Info.fBigStep = rcPlate.Height(); + + AutoRestorer restorer(¬ify_flag_, true); notify_->SetScrollInfo(Info); } @@ -1184,8 +1183,7 @@ void CPWL_EditImpl::SetScrollPosY(float fy) { if (notify_) { if (!notify_flag_) { - AutoRestorer restorer(¬ify_flag_); - notify_flag_ = true; + AutoRestorer restorer(¬ify_flag_, true); notify_->SetScrollPosition(fy); } } @@ -1295,8 +1293,7 @@ void CPWL_EditImpl::Refresh() { if (notify_) { if (!notify_flag_) { - AutoRestorer restorer(¬ify_flag_); - notify_flag_ = true; + AutoRestorer restorer(¬ify_flag_, true); std::vector* pRects = refresh_.GetRefreshRects(); for (auto& rect : *pRects) { if (!notify_->InvalidateRect(&rect)) { @@ -1368,8 +1365,7 @@ void CPWL_EditImpl::RefreshWordRange(const CPVT_WordRange& wr) { if (notify_) { if (!notify_flag_) { - AutoRestorer restorer(¬ify_flag_); - notify_flag_ = true; + AutoRestorer restorer(¬ify_flag_, true); CFX_FloatRect rcRefresh = VTToEdit(word_rect); if (!notify_->InvalidateRect(&rcRefresh)) { notify_ = nullptr; // Gone, dangling even. @@ -1384,8 +1380,7 @@ void CPWL_EditImpl::RefreshWordRange(const CPVT_WordRange& wr) { if (notify_) { if (!notify_flag_) { - AutoRestorer restorer(¬ify_flag_); - notify_flag_ = true; + AutoRestorer restorer(¬ify_flag_, true); CFX_FloatRect rcRefresh = VTToEdit(rcLine); if (!notify_->InvalidateRect(&rcRefresh)) { notify_ = nullptr; // Gone, dangling even. @@ -1425,8 +1420,7 @@ void CPWL_EditImpl::SetCaretInfo() { ptFoot.y = line.ptLine.y + line.fLineDescent; } - AutoRestorer restorer(¬ify_flag_); - notify_flag_ = true; + AutoRestorer restorer(¬ify_flag_, true); notify_->SetCaret(sel_state_.IsEmpty(), VTToEdit(ptHead), VTToEdit(ptFoot)); } diff --git a/fxjs/cjs_event_context.cpp b/fxjs/cjs_event_context.cpp index f1bd3c7d92..4ce542fec2 100644 --- a/fxjs/cjs_event_context.cpp +++ b/fxjs/cjs_event_context.cpp @@ -34,8 +34,7 @@ std::optional CJS_EventContext::RunScript( JSGetStringFromID(JSMessage::kBusyError)); } - AutoRestorer restorer(&busy_); - busy_ = true; + AutoRestorer restorer(&busy_, true); DCHECK(IsValid()); CJS_Runtime::FieldEvent event(TargetName(), EventKind()); diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp index 521026f130..60645070c9 100644 --- a/fxjs/xfa/cfxjse_engine.cpp +++ b/fxjs/xfa/cfxjse_engine.cpp @@ -207,9 +207,7 @@ CFXJSE_Context::ExecutionResult CFXJSE_Engine::RunScript( WideStringView wsScript, CXFA_Object* pThisObject) { CFXJSE_ScopeUtil_IsolateHandleContext scope(GetJseContext()); - AutoRestorer typeRestorer(&script_type_); - script_type_ = eScriptType; - + AutoRestorer typeRestorer(&script_type_, eScriptType); ByteString btScript; if (eScriptType == CXFA_Script::Type::Formcalc) { if (!form_calc_context_) { @@ -760,9 +758,7 @@ CFXJSE_Engine::ResolveObjectsWithBindNode(CXFA_Object* refObject, return std::nullopt; } - AutoRestorer resolving_restorer(&resolving_nodes_); - resolving_nodes_ = true; - + AutoRestorer resolving_restorer(&resolving_nodes_, true); const bool bParentOrSiblings = !!(dwStyles & Mask{XFA_ResolveFlag::kParent, XFA_ResolveFlag::kSiblings}); From b87fc9ab98f67a7b0d8cbeab25e22f18b2e90322 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Wed, 14 Oct 2026 14:54:47 -0700 Subject: [PATCH 29/37] Make CFFL_FieldAction a true aggregate. This is possible now that the out-of-line constructor requirement has been relaxed. Use designated initializers where possible. -- convert members to google_style. -- remove redundant assignment of members to default values. Change-Id: If5144766a3c5c5b7809328d9263413364251af52 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160950 Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- fpdfsdk/cpdfsdk_formfillenvironment.cpp | 28 ++-- fpdfsdk/cpdfsdk_interactiveform.cpp | 9 +- fpdfsdk/cpdfsdk_widget.cpp | 34 ++--- fpdfsdk/formfiller/BUILD.gn | 1 - fpdfsdk/formfiller/cffl_combobox.cpp | 23 ++- .../formfiller/cffl_combobox_embeddertest.cpp | 23 +-- fpdfsdk/formfiller/cffl_fieldaction.cpp | 11 -- fpdfsdk/formfiller/cffl_fieldaction.h | 26 ++-- fpdfsdk/formfiller/cffl_formfield.cpp | 2 +- .../formfiller/cffl_interactiveformfiller.cpp | 135 +++++++++--------- fpdfsdk/formfiller/cffl_listbox.cpp | 8 +- fpdfsdk/formfiller/cffl_textfield.cpp | 18 +-- 12 files changed, 148 insertions(+), 170 deletions(-) delete mode 100644 fpdfsdk/formfiller/cffl_fieldaction.cpp diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp index 93e07e0057..e85a9bf5c6 100644 --- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp +++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp @@ -1248,35 +1248,35 @@ void CPDFSDK_FormFillEnvironment::RunFieldJavaScript( RunScript(script, [type, data, pFormField](IJS_EventContext* context) { switch (type) { case CPDF_AAction::kCursorEnter: - context->OnField_MouseEnter(data->bModifier, data->bShift, pFormField); + context->OnField_MouseEnter(data->modifier, data->shift, pFormField); break; case CPDF_AAction::kCursorExit: - context->OnField_MouseExit(data->bModifier, data->bShift, pFormField); + context->OnField_MouseExit(data->modifier, data->shift, pFormField); break; case CPDF_AAction::kButtonDown: - context->OnField_MouseDown(data->bModifier, data->bShift, pFormField); + context->OnField_MouseDown(data->modifier, data->shift, pFormField); break; case CPDF_AAction::kButtonUp: - context->OnField_MouseUp(data->bModifier, data->bShift, pFormField); + context->OnField_MouseUp(data->modifier, data->shift, pFormField); break; case CPDF_AAction::kGetFocus: - context->OnField_Focus(data->bModifier, data->bShift, pFormField, - &data->sValue); + context->OnField_Focus(data->modifier, data->shift, pFormField, + &data->value); break; case CPDF_AAction::kLoseFocus: - context->OnField_Blur(data->bModifier, data->bShift, pFormField, - &data->sValue); + context->OnField_Blur(data->modifier, data->shift, pFormField, + &data->value); break; case CPDF_AAction::kKeyStroke: context->OnField_Keystroke( - &data->sChange, data->sChangeEx, data->bKeyDown, data->bModifier, - &data->nSelEnd, &data->nSelStart, data->bShift, pFormField, - &data->sValue, data->bWillCommit, data->bFieldFull, &data->bRC); + &data->change, data->change_ex, data->key_down, data->modifier, + &data->sel_end, &data->sel_start, data->shift, pFormField, + &data->value, data->will_commit, data->field_full, &data->rc); break; case CPDF_AAction::kValidate: - context->OnField_Validate(&data->sChange, data->sChangeEx, - data->bKeyDown, data->bModifier, data->bShift, - pFormField, &data->sValue, &data->bRC); + context->OnField_Validate(&data->change, data->change_ex, + data->key_down, data->modifier, data->shift, + pFormField, &data->value, &data->rc); break; default: NOTREACHED(); diff --git a/fpdfsdk/cpdfsdk_interactiveform.cpp b/fpdfsdk/cpdfsdk_interactiveform.cpp index f4543117b8..6bbf97d16a 100644 --- a/fpdfsdk/cpdfsdk_interactiveform.cpp +++ b/fpdfsdk/cpdfsdk_interactiveform.cpp @@ -385,13 +385,12 @@ bool CPDFSDK_InteractiveForm::OnValidate(CPDF_FormField* pFormField, return true; } - CFFL_FieldAction fa; - fa.bModifier = false; - fa.bShift = false; - fa.sValue = csValue; + CFFL_FieldAction fa = { + .value = csValue, + }; form_fill_env_->DoActionFieldJavaScript(action, CPDF_AAction::kValidate, pFormField, &fa); - return fa.bRC; + return fa.rc; } bool CPDFSDK_InteractiveForm::DoAction_Hide(const CPDF_Action& action) { diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp index 6b928906f3..9866a3d057 100644 --- a/fpdfsdk/cpdfsdk_widget.cpp +++ b/fpdfsdk/cpdfsdk_widget.cpp @@ -240,15 +240,15 @@ bool CPDFSDK_Widget::OnXFAAAction(PDFSDK_XFAAActionType eXFAAAT, } CXFA_EventParam param(eEventType); - param.change_ = data->sChange; + param.change_ = data->change; param.commit_key_ = 0; - param.shift_ = data->bShift; - param.sel_start_ = data->nSelStart; - param.sel_end_ = data->nSelEnd; - param.full_text_ = data->sValue; - param.key_down_ = data->bKeyDown; - param.modifier_ = data->bModifier; - param.prev_text_ = data->sValue; + param.shift_ = data->shift; + param.sel_start_ = data->sel_start; + param.sel_end_ = data->sel_end; + param.full_text_ = data->value; + param.key_down_ = data->key_down; + param.modifier_ = data->modifier; + param.prev_text_ = data->value; if ((eEventType == XFA_EVENT_Click || eEventType == XFA_EVENT_Change) && GetFieldType() == FormFieldType::kRadioButton) { CXFA_FFWidget* hGroupWidget = GetGroupMixXFAWidget(); @@ -332,7 +332,7 @@ bool CPDFSDK_Widget::HandleXFAAAction( return false; } - XFA_EVENTTYPE eEventType = GetXFAEventType(type, data->bWillCommit); + XFA_EVENTTYPE eEventType = GetXFAEventType(type, data->will_commit); if (eEventType == XFA_EVENT_Unknown) { return false; } @@ -343,15 +343,15 @@ bool CPDFSDK_Widget::HandleXFAAAction( } CXFA_EventParam param(eEventType); - param.change_ = data->sChange; + param.change_ = data->change; param.commit_key_ = 0; - param.shift_ = data->bShift; - param.sel_start_ = data->nSelStart; - param.sel_end_ = data->nSelEnd; - param.full_text_ = data->sValue; - param.key_down_ = data->bKeyDown; - param.modifier_ = data->bModifier; - param.prev_text_ = data->sValue; + param.shift_ = data->shift; + param.sel_start_ = data->sel_start; + param.sel_end_ = data->sel_end; + param.full_text_ = data->value; + param.key_down_ = data->key_down; + param.modifier_ = data->modifier; + param.prev_text_ = data->value; bool ret = hWidget->ProcessEventUnderHandler(¶m, pXFAWidgetHandler); CXFA_FFDocView* pDocView = context->GetXFADocView(); if (pDocView) { diff --git a/fpdfsdk/formfiller/BUILD.gn b/fpdfsdk/formfiller/BUILD.gn index 4652b0f408..e89b2b1a4e 100644 --- a/fpdfsdk/formfiller/BUILD.gn +++ b/fpdfsdk/formfiller/BUILD.gn @@ -13,7 +13,6 @@ source_set("formfiller") { "cffl_checkbox.h", "cffl_combobox.cpp", "cffl_combobox.h", - "cffl_fieldaction.cpp", "cffl_fieldaction.h", "cffl_formfield.cpp", "cffl_formfield.h", diff --git a/fpdfsdk/formfiller/cffl_combobox.cpp b/fpdfsdk/formfiller/cffl_combobox.cpp index eb7fd98e3c..ab1f3d3bc6 100644 --- a/fpdfsdk/formfiller/cffl_combobox.cpp +++ b/fpdfsdk/formfiller/cffl_combobox.cpp @@ -128,14 +128,13 @@ void CFFL_ComboBox::GetActionData(const CPDFSDK_PageView* pPageView, case CPDF_AAction::kKeyStroke: if (CPWL_ComboBox* pComboBox = GetPWLComboBox(pPageView)) { if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { - fa.bFieldFull = pEdit->IsTextFull(); - std::tie(fa.nSelStart, fa.nSelEnd) = pEdit->GetSelection(); - fa.sValue = pEdit->GetText(); - fa.sChangeEx = GetSelectExportText(); - - if (fa.bFieldFull) { - fa.sChange.clear(); - fa.sChangeEx.clear(); + fa.field_full = pEdit->IsTextFull(); + std::tie(fa.sel_start, fa.sel_end) = pEdit->GetSelection(); + fa.value = pEdit->GetText(); + fa.change_ex = GetSelectExportText(); + if (fa.field_full) { + fa.change.clear(); + fa.change_ex.clear(); } } } @@ -143,13 +142,13 @@ void CFFL_ComboBox::GetActionData(const CPDFSDK_PageView* pPageView, case CPDF_AAction::kValidate: if (CPWL_ComboBox* pComboBox = GetPWLComboBox(pPageView)) { if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { - fa.sValue = pEdit->GetText(); + fa.value = pEdit->GetText(); } } break; case CPDF_AAction::kLoseFocus: case CPDF_AAction::kGetFocus: - fa.sValue = widget_->GetValue(); + fa.value = widget_->GetValue(); break; default: break; @@ -163,8 +162,8 @@ void CFFL_ComboBox::SetActionData(const CPDFSDK_PageView* pPageView, case CPDF_AAction::kKeyStroke: if (CPWL_ComboBox* pComboBox = GetPWLComboBox(pPageView)) { if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { - pEdit->SetSelection(fa.nSelStart, fa.nSelEnd); - pEdit->ReplaceSelection(fa.sChange); + pEdit->SetSelection(fa.sel_start, fa.sel_end); + pEdit->ReplaceSelection(fa.change); } } break; diff --git a/fpdfsdk/formfiller/cffl_combobox_embeddertest.cpp b/fpdfsdk/formfiller/cffl_combobox_embeddertest.cpp index 3e1789f711..cf5d4ab665 100644 --- a/fpdfsdk/formfiller/cffl_combobox_embeddertest.cpp +++ b/fpdfsdk/formfiller/cffl_combobox_embeddertest.cpp @@ -17,22 +17,22 @@ TEST_F(CFFLComboBoxEmbedderTest, GetActionData) { CFFL_FieldAction result; GetCFFLFormField()->GetActionData(GetPageView(), CPDF_AAction::kKeyStroke, result); - EXPECT_EQ(L"Banana", result.sValue); - EXPECT_EQ(L"Banana", result.sChangeEx); + EXPECT_EQ(L"Banana", result.value); + EXPECT_EQ(L"Banana", result.change_ex); } { CFFL_FieldAction result; GetCFFLFormField()->GetActionData(GetPageView(), CPDF_AAction::kValidate, result); - EXPECT_EQ(L"Banana", result.sValue); - EXPECT_EQ(L"", result.sChangeEx); + EXPECT_EQ(L"Banana", result.value); + EXPECT_EQ(L"", result.change_ex); } { CFFL_FieldAction result; GetCFFLFormField()->GetActionData(GetPageView(), CPDF_AAction::kGetFocus, result); - EXPECT_EQ(L"Banana", result.sValue); - EXPECT_EQ(L"", result.sChangeEx); + EXPECT_EQ(L"Banana", result.value); + EXPECT_EQ(L"", result.change_ex); } } @@ -40,15 +40,16 @@ TEST_F(CFFLComboBoxEmbedderTest, SetActionData) { ScopedPage page = CreateAndInitializeFormComboboxPDF(); ASSERT_TRUE(page); FormFillerAndWindowSetup(GetCPDFSDKAnnotNormal()); - CFFL_FieldAction input_fa; - input_fa.nSelStart = 2; - input_fa.nSelEnd = 4; - input_fa.sChange = L"Hamster"; + CFFL_FieldAction input_fa = { + .sel_start = 2, + .sel_end = 4, + .change = L"Hamster", + }; GetCFFLFormField()->SetActionData(GetPageView(), CPDF_AAction::kKeyStroke, input_fa); CFFL_FieldAction output_fa; GetCFFLFormField()->GetActionData(GetPageView(), CPDF_AAction::kKeyStroke, output_fa); - EXPECT_EQ(L"BaHamsterna", output_fa.sValue); + EXPECT_EQ(L"BaHamsterna", output_fa.value); } diff --git a/fpdfsdk/formfiller/cffl_fieldaction.cpp b/fpdfsdk/formfiller/cffl_fieldaction.cpp deleted file mode 100644 index 8ee28cbaf7..0000000000 --- a/fpdfsdk/formfiller/cffl_fieldaction.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2016 The PDFium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "fpdfsdk/formfiller/cffl_fieldaction.h" - -CFFL_FieldAction::CFFL_FieldAction() = default; - -CFFL_FieldAction::~CFFL_FieldAction() = default; diff --git a/fpdfsdk/formfiller/cffl_fieldaction.h b/fpdfsdk/formfiller/cffl_fieldaction.h index 0bd6824cfe..e6949c3661 100644 --- a/fpdfsdk/formfiller/cffl_fieldaction.h +++ b/fpdfsdk/formfiller/cffl_fieldaction.h @@ -10,21 +10,17 @@ #include "core/fxcrt/widestring.h" struct CFFL_FieldAction { - CFFL_FieldAction(); - CFFL_FieldAction(const CFFL_FieldAction& other) = delete; - ~CFFL_FieldAction(); - - bool bModifier = false; - bool bShift = false; - bool bKeyDown = false; - bool bWillCommit = false; - bool bFieldFull = false; - bool bRC = true; - int nSelEnd = 0; - int nSelStart = 0; - WideString sChange; - WideString sChangeEx; - WideString sValue; + bool modifier = false; + bool shift = false; + bool key_down = false; + bool will_commit = false; + bool field_full = false; + bool rc = true; + int sel_start = 0; + int sel_end = 0; + WideString change; + WideString change_ex; + WideString value; }; #endif // FPDFSDK_FORMFILLER_CFFL_FIELDACTION_H_ diff --git a/fpdfsdk/formfiller/cffl_formfield.cpp b/fpdfsdk/formfiller/cffl_formfield.cpp index 790ad3e878..ccef4c3785 100644 --- a/fpdfsdk/formfiller/cffl_formfield.cpp +++ b/fpdfsdk/formfiller/cffl_formfield.cpp @@ -583,7 +583,7 @@ void CFFL_FormField::SetChangeMark() { void CFFL_FormField::GetActionData(const CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, CFFL_FieldAction& fa) { - fa.sValue = widget_->GetValue(); + fa.value = widget_->GetValue(); } void CFFL_FormField::SetActionData(const CPDFSDK_PageView* pPageView, diff --git a/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp b/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp index b2e521141e..22e1a0bc00 100644 --- a/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp +++ b/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp @@ -108,10 +108,10 @@ void CFFL_InteractiveFormFiller::OnMouseEnter( pWidget->set_appearance_modified(false); DCHECK(pPageView); { - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); - + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlag), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlag), + }; AutoRestorer restorer(¬ifying_, true); pWidget->OnAAction(CPDF_AAction::kCursorEnter, &fa, pPageView); } @@ -143,10 +143,10 @@ void CFFL_InteractiveFormFiller::OnMouseExit( pWidget->set_appearance_modified(false); DCHECK(pPageView); { - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); - + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlag), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlag), + }; AutoRestorer restorer(¬ifying_, true); pWidget->OnAAction(CPDF_AAction::kCursorExit, &fa, pPageView); } @@ -180,10 +180,10 @@ bool CFFL_InteractiveFormFiller::OnLButtonDown( pWidget->set_appearance_modified(false); DCHECK(pPageView); { - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlags); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlags); - + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlags), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlags), + }; AutoRestorer restorer(¬ifying_, true); pWidget->OnAAction(CPDF_AAction::kButtonDown, &fa, pPageView); } @@ -262,14 +262,14 @@ bool CFFL_InteractiveFormFiller::OnButtonUp( return false; } + DCHECK(pPageView); uint32_t nAge = pWidget->GetAppearanceAge(); uint32_t nValueAge = pWidget->GetValueAge(); - DCHECK(pPageView); { - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); - + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlag), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlag), + }; AutoRestorer restorer(¬ifying_, true); pWidget->OnAAction(CPDF_AAction::kButtonUp, &fa, pPageView); } @@ -406,10 +406,10 @@ bool CFFL_InteractiveFormFiller::OnSetFocus( CPDFSDK_PageView* pPageView = pWidget->GetPageView(); DCHECK(pPageView); { - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); - + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlag), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlag), + }; AutoRestorer restorer(¬ifying_, true); pFormField->GetActionData(pPageView, CPDF_AAction::kGetFocus, fa); pWidget->OnAAction(CPDF_AAction::kGetFocus, &fa, pPageView); @@ -465,10 +465,10 @@ bool CFFL_InteractiveFormFiller::OnKillFocus( CPDFSDK_PageView* pPageView = pWidget->GetPageView(); DCHECK(pPageView); { - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); - + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlag), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlag), + }; AutoRestorer restorer(¬ifying_, true); pFormField->GetActionData(pPageView, CPDF_AAction::kLoseFocus, fa); pWidget->OnAAction(CPDF_AAction::kLoseFocus, &fa, pPageView); @@ -737,13 +737,12 @@ bool CFFL_InteractiveFormFiller::OnKeyStrokeCommit( DCHECK(pPageView); pWidget->set_appearance_modified(false); - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); - fa.bWillCommit = true; - fa.bKeyDown = true; - fa.bRC = true; - + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlag), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlag), + .key_down = true, + .will_commit = true, + }; AutoRestorer restorer(¬ifying_, true); CFFL_FormField* pFormField = GetFormField(pWidget.Get()); pFormField->GetActionData(pPageView, CPDF_AAction::kKeyStroke, fa); @@ -753,8 +752,7 @@ bool CFFL_InteractiveFormFiller::OnKeyStrokeCommit( if (!pWidget) { return true; } - - return fa.bRC; + return fa.rc; } bool CFFL_InteractiveFormFiller::OnValidate( @@ -772,12 +770,11 @@ bool CFFL_InteractiveFormFiller::OnValidate( DCHECK(pPageView); pWidget->set_appearance_modified(false); - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); - fa.bKeyDown = true; - fa.bRC = true; - + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlag), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlag), + .key_down = true, + }; AutoRestorer restorer(¬ifying_, true); CFFL_FormField* pFormField = GetFormField(pWidget.Get()); pFormField->GetActionData(pPageView, CPDF_AAction::kValidate, fa); @@ -788,7 +785,7 @@ bool CFFL_InteractiveFormFiller::OnValidate( return true; } - return fa.bRC; + return fa.rc; } void CFFL_InteractiveFormFiller::OnCalculate( @@ -826,10 +823,10 @@ bool CFFL_InteractiveFormFiller::OnClick(ObservedPtr& pWidget, uint32_t nAge = pWidget->GetAppearanceAge(); uint32_t nValueAge = pWidget->GetValueAge(); { - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); - + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlag), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlag), + }; AutoRestorer restorer(¬ifying_, true); pWidget->OnXFAAAction(PDFSDK_XFA_Click, &fa, pPageView); } @@ -861,10 +858,10 @@ bool CFFL_InteractiveFormFiller::OnFull(ObservedPtr& pWidget, uint32_t nAge = pWidget->GetAppearanceAge(); uint32_t nValueAge = pWidget->GetValueAge(); { - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); - + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlag), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlag), + }; AutoRestorer restorer(¬ifying_, true); pWidget->OnXFAAAction(PDFSDK_XFA_Full, &fa, pPageView); } @@ -896,10 +893,10 @@ bool CFFL_InteractiveFormFiller::OnPreOpen(ObservedPtr& pWidget, uint32_t nAge = pWidget->GetAppearanceAge(); uint32_t nValueAge = pWidget->GetValueAge(); { - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); - + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlag), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlag), + }; AutoRestorer restorer(¬ifying_, true); pWidget->OnXFAAAction(PDFSDK_XFA_PreOpen, &fa, pPageView); } @@ -932,10 +929,10 @@ bool CFFL_InteractiveFormFiller::OnPostOpen( uint32_t nAge = pWidget->GetAppearanceAge(); uint32_t nValueAge = pWidget->GetValueAge(); { - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); - + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlag), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlag), + }; AutoRestorer restorer(¬ifying_, true); pWidget->OnXFAAAction(PDFSDK_XFA_PostOpen, &fa, pPageView); } @@ -990,20 +987,18 @@ CFFL_InteractiveFormFiller::OnBeforeKeyStroke( return {true, false}; } - AutoRestorer restorer(¬ifying_, true); uint32_t nAge = pWidget->GetAppearanceAge(); uint32_t nValueAge = pWidget->GetValueAge(); - - CFFL_FieldAction fa; - fa.bModifier = CPWL_Wnd::IsCTRLKeyDown(nFlag); - fa.bShift = CPWL_Wnd::IsSHIFTKeyDown(nFlag); - fa.sChange = strChange; - fa.sChangeEx = strChangeEx; - fa.bKeyDown = bKeyDown; - fa.bWillCommit = false; - fa.bRC = true; - fa.nSelStart = nSelStart; - fa.nSelEnd = nSelEnd; + CFFL_FieldAction fa = { + .modifier = CPWL_Wnd::IsCTRLKeyDown(nFlag), + .shift = CPWL_Wnd::IsSHIFTKeyDown(nFlag), + .key_down = bKeyDown, + .sel_start = nSelStart, + .sel_end = nSelEnd, + .change = strChange, + .change_ex = strChangeEx, + }; + AutoRestorer restorer(¬ifying_, true); pFormField->GetActionData(pPageView, CPDF_AAction::kKeyStroke, fa); pFormField->SavePWLWindowState(pPageView); @@ -1029,7 +1024,7 @@ CFFL_InteractiveFormFiller::OnBeforeKeyStroke( pPageView = pPrivateData->GetPageView(); bExit = true; } - if (fa.bRC) { + if (fa.rc) { pFormField->SetActionData(pPageView, CPDF_AAction::kKeyStroke, fa); } else { pFormField->RecreatePWLWindowFromSavedState(pPageView); diff --git a/fpdfsdk/formfiller/cffl_listbox.cpp b/fpdfsdk/formfiller/cffl_listbox.cpp index 12a8857563..9d76623891 100644 --- a/fpdfsdk/formfiller/cffl_listbox.cpp +++ b/fpdfsdk/formfiller/cffl_listbox.cpp @@ -160,13 +160,13 @@ void CFFL_ListBox::GetActionData(const CPDFSDK_PageView* pPageView, switch (type) { case CPDF_AAction::kValidate: if (widget_->GetFieldFlags() & pdfium::form_flags::kChoiceMultiSelect) { - fa.sValue.clear(); + fa.value.clear(); } else { CPWL_ListBox* pListBox = GetPWLListBox(pPageView); if (pListBox) { int32_t nCurSel = pListBox->GetCurSel(); if (nCurSel >= 0) { - fa.sValue = widget_->GetOptionLabel(nCurSel); + fa.value = widget_->GetOptionLabel(nCurSel); } } } @@ -174,11 +174,11 @@ void CFFL_ListBox::GetActionData(const CPDFSDK_PageView* pPageView, case CPDF_AAction::kLoseFocus: case CPDF_AAction::kGetFocus: if (widget_->GetFieldFlags() & pdfium::form_flags::kChoiceMultiSelect) { - fa.sValue.clear(); + fa.value.clear(); } else { int32_t nCurSel = widget_->GetSelectedIndex(0); if (nCurSel >= 0) { - fa.sValue = widget_->GetOptionLabel(nCurSel); + fa.value = widget_->GetOptionLabel(nCurSel); } } break; diff --git a/fpdfsdk/formfiller/cffl_textfield.cpp b/fpdfsdk/formfiller/cffl_textfield.cpp index 9b0d1261b6..bbdf2ae354 100644 --- a/fpdfsdk/formfiller/cffl_textfield.cpp +++ b/fpdfsdk/formfiller/cffl_textfield.cpp @@ -187,22 +187,22 @@ void CFFL_TextField::GetActionData(const CPDFSDK_PageView* pPageView, switch (type) { case CPDF_AAction::kKeyStroke: if (CPWL_Edit* pWnd = GetPWLEdit(pPageView)) { - fa.bFieldFull = pWnd->IsTextFull(); - fa.sValue = pWnd->GetText(); - if (fa.bFieldFull) { - fa.sChange.clear(); - fa.sChangeEx.clear(); + fa.field_full = pWnd->IsTextFull(); + fa.value = pWnd->GetText(); + if (fa.field_full) { + fa.change.clear(); + fa.change_ex.clear(); } } break; case CPDF_AAction::kValidate: if (CPWL_Edit* pWnd = GetPWLEdit(pPageView)) { - fa.sValue = pWnd->GetText(); + fa.value = pWnd->GetText(); } break; case CPDF_AAction::kLoseFocus: case CPDF_AAction::kGetFocus: - fa.sValue = widget_->GetValue(); + fa.value = widget_->GetValue(); break; default: break; @@ -216,8 +216,8 @@ void CFFL_TextField::SetActionData(const CPDFSDK_PageView* pPageView, case CPDF_AAction::kKeyStroke: if (CPWL_Edit* pEdit = GetPWLEdit(pPageView)) { pEdit->SetFocus(); - pEdit->SetSelection(fa.nSelStart, fa.nSelEnd); - pEdit->ReplaceSelection(fa.sChange); + pEdit->SetSelection(fa.sel_start, fa.sel_end); + pEdit->ReplaceSelection(fa.change); } break; default: From 49861466fc4bb0c4f97c1e3af82b0cfbcf5f7637 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Wed, 14 Oct 2026 14:59:59 -0700 Subject: [PATCH 30/37] Remove unnecessary public access specifiers from structs Structs default to public access, so the explicit public: access specifier is redundant and can be safely removed to clean up the codebase. -- Make aggregates where possible. -- Make struct inheriting from class into a class. Change-Id: I8f4762dbdbc380061db4d92cb1393c57483568ba Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160970 Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- core/fxcrt/fx_memory_wrappers.h | 1 - fpdfsdk/pwl/cpwl_scroll_bar.h | 22 +++++----------------- fxjs/cjs_global.h | 2 +- xfa/fgas/font/cfgas_fontmgr.h | 1 - 4 files changed, 6 insertions(+), 20 deletions(-) diff --git a/core/fxcrt/fx_memory_wrappers.h b/core/fxcrt/fx_memory_wrappers.h index f68948275d..e34af90f8d 100644 --- a/core/fxcrt/fx_memory_wrappers.h +++ b/core/fxcrt/fx_memory_wrappers.h @@ -32,7 +32,6 @@ struct IsFXDataPartitionException : std::false_type {}; // undo some of the nice segregation that we get from PartitionAlloc. template struct FxPartitionAllocAllocator { - public: static_assert(std::is_arithmetic::value || std::is_enum::value || IsFXDataPartitionException::value, "Only numeric types allowed in this partition"); diff --git a/fpdfsdk/pwl/cpwl_scroll_bar.h b/fpdfsdk/pwl/cpwl_scroll_bar.h index 28b6137c89..62942d781d 100644 --- a/fpdfsdk/pwl/cpwl_scroll_bar.h +++ b/fpdfsdk/pwl/cpwl_scroll_bar.h @@ -15,28 +15,17 @@ #include "fpdfsdk/pwl/cpwl_wnd.h" struct PWL_SCROLL_INFO { - public: - PWL_SCROLL_INFO() - : fContentMin(0.0f), - fContentMax(0.0f), - fPlateWidth(0.0f), - fBigStep(0.0f), - fSmallStep(0.0f) {} - friend constexpr bool operator==(const PWL_SCROLL_INFO&, const PWL_SCROLL_INFO&) = default; - float fContentMin; - float fContentMax; - float fPlateWidth; - float fBigStep; - float fSmallStep; + float fContentMin = 0.0f; + float fContentMax = 0.0f; + float fPlateWidth = 0.0f; + float fBigStep = 0.0f; + float fSmallStep = 0.0f; }; struct PWL_FLOATRANGE { - public: - PWL_FLOATRANGE() = default; - friend constexpr bool operator==(const PWL_FLOATRANGE&, const PWL_FLOATRANGE&) = default; @@ -50,7 +39,6 @@ struct PWL_FLOATRANGE { }; struct PWL_SCROLL_PRIVATEDATA { - public: PWL_SCROLL_PRIVATEDATA(); friend constexpr bool operator==(const PWL_SCROLL_PRIVATEDATA&, diff --git a/fxjs/cjs_global.h b/fxjs/cjs_global.h index acc0580044..02b5d65cb4 100644 --- a/fxjs/cjs_global.h +++ b/fxjs/cjs_global.h @@ -58,7 +58,7 @@ class CJS_Global final : public CJS_Object { ~CJS_Global() override; private: - struct JSGlobalData : public CFX_Value { + class JSGlobalData : public CFX_Value { public: JSGlobalData(); ~JSGlobalData(); diff --git a/xfa/fgas/font/cfgas_fontmgr.h b/xfa/fgas/font/cfgas_fontmgr.h index 3094dedca8..8c558fe7e6 100644 --- a/xfa/fgas/font/cfgas_fontmgr.h +++ b/xfa/fgas/font/cfgas_fontmgr.h @@ -59,7 +59,6 @@ inline bool operator==(const FX_FONTDESCRIPTOR& left, class CFGAS_FontDescriptor { public: struct Rank { - public: UNOWNED_PTR_EXCLUSION CFGAS_FontDescriptor* font; // POD struct. int32_t penalty; From 5b39cca7f5c26c8063247e7c4057724f0fe78482 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Wed, 14 Oct 2026 16:52:46 -0700 Subject: [PATCH 31/37] Use display lists for font subsetting tests in FPDFSaveEmbedderTest Replace fragile golden PNG image comparisons in FPDFSaveWithFontSubsetEmbedderTest with display list codepoint checks. The display list approach verifies the text emitted by the font subsetting and save operations directly, avoiding rasterization, hinting, and font engine discrepancies between FreeType and Fontations/Skia. Delete 12 obsolete golden PNG expectation files. Change-Id: I63bab25d46cf02f6b9e40686ff63c5dea9b53448 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160070 Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- fpdfsdk/fpdf_edit_embeddertest.cpp | 83 +++++------------- fpdfsdk/fpdf_save_embeddertest.cpp | 21 +++-- .../blank_page_612x792.dump.txt | 6 ++ .../embedder_tests/blue_path.dump.txt | 10 +++ .../embedder_tests/blue_path_agg.png | Bin 2290 -> 0 bytes .../embedder_tests/blue_path_saved.dump.txt | 10 +++ .../embedder_tests/blue_path_skia.png | Bin 2518 -> 0 bytes .../blue_rectangle_alpha.dump.txt | 7 ++ .../embedder_tests/blue_rectangle_alpha.png | Bin 338 -> 0 bytes .../embedder_tests/bug_1549.dump.txt | 8 ++ testing/resources/embedder_tests/bug_1549.png | Bin 143 -> 0 bytes .../bug_1549_incorrect.dump.txt | 7 ++ .../embedder_tests/bug_1549_incorrect.png | Bin 126 -> 0 bytes .../embedder_tests/bug_1549_removed.dump.txt | 7 ++ .../embedder_tests/bug_1549_removed.png | Bin 126 -> 0 bytes ...m_object_with_image_removed_image.dump.txt | 8 ++ .../form_object_with_image_removed_image.png | Bin 115 -> 0 bytes .../red_green_rectangles.dump.txt | 8 ++ .../embedder_tests/red_green_rectangles.png | Bin 609 -> 0 bytes ...d_green_rectangles_black_triangle.dump.txt | 9 ++ .../red_green_rectangles_black_triangle.png | Bin 1277 -> 0 bytes .../embedder_tests/red_rectangle.dump.txt | 7 ++ .../embedder_tests/red_rectangle.png | Bin 337 -> 0 bytes .../red_rectangle_alpha.dump.txt | 7 ++ .../embedder_tests/red_rectangle_alpha.png | Bin 338 -> 0 bytes .../save_multiple_fonts.dump.txt | 10 +++ .../save_multiple_fonts_agg_linux.png | Bin 3802 -> 0 bytes .../save_multiple_fonts_agg_mac.png | Bin 3708 -> 0 bytes .../save_multiple_fonts_agg_win.png | Bin 3815 -> 0 bytes .../save_multiple_fonts_skia_linux.png | Bin 3232 -> 0 bytes .../save_multiple_fonts_skia_mac.png | Bin 3709 -> 0 bytes .../save_multiple_fonts_skia_win.png | Bin 1997 -> 0 bytes .../embedder_tests/save_new_text.dump.txt | 9 ++ .../save_new_text_agg_linux.png | Bin 2869 -> 0 bytes .../embedder_tests/save_new_text_agg_mac.png | Bin 2778 -> 0 bytes .../embedder_tests/save_new_text_agg_win.png | Bin 2882 -> 0 bytes .../save_new_text_skia_linux.png | Bin 2431 -> 0 bytes .../embedder_tests/save_new_text_skia_mac.png | Bin 2773 -> 0 bytes .../embedder_tests/save_new_text_skia_win.png | Bin 1531 -> 0 bytes 39 files changed, 147 insertions(+), 70 deletions(-) create mode 100644 testing/resources/embedder_tests/blank_page_612x792.dump.txt create mode 100644 testing/resources/embedder_tests/blue_path.dump.txt delete mode 100644 testing/resources/embedder_tests/blue_path_agg.png create mode 100644 testing/resources/embedder_tests/blue_path_saved.dump.txt delete mode 100644 testing/resources/embedder_tests/blue_path_skia.png create mode 100644 testing/resources/embedder_tests/blue_rectangle_alpha.dump.txt delete mode 100644 testing/resources/embedder_tests/blue_rectangle_alpha.png create mode 100644 testing/resources/embedder_tests/bug_1549.dump.txt delete mode 100644 testing/resources/embedder_tests/bug_1549.png create mode 100644 testing/resources/embedder_tests/bug_1549_incorrect.dump.txt delete mode 100644 testing/resources/embedder_tests/bug_1549_incorrect.png create mode 100644 testing/resources/embedder_tests/bug_1549_removed.dump.txt delete mode 100644 testing/resources/embedder_tests/bug_1549_removed.png create mode 100644 testing/resources/embedder_tests/form_object_with_image_removed_image.dump.txt delete mode 100644 testing/resources/embedder_tests/form_object_with_image_removed_image.png create mode 100644 testing/resources/embedder_tests/red_green_rectangles.dump.txt delete mode 100644 testing/resources/embedder_tests/red_green_rectangles.png create mode 100644 testing/resources/embedder_tests/red_green_rectangles_black_triangle.dump.txt delete mode 100644 testing/resources/embedder_tests/red_green_rectangles_black_triangle.png create mode 100644 testing/resources/embedder_tests/red_rectangle.dump.txt delete mode 100644 testing/resources/embedder_tests/red_rectangle.png create mode 100644 testing/resources/embedder_tests/red_rectangle_alpha.dump.txt delete mode 100644 testing/resources/embedder_tests/red_rectangle_alpha.png create mode 100644 testing/resources/embedder_tests/save_multiple_fonts.dump.txt delete mode 100644 testing/resources/embedder_tests/save_multiple_fonts_agg_linux.png delete mode 100644 testing/resources/embedder_tests/save_multiple_fonts_agg_mac.png delete mode 100644 testing/resources/embedder_tests/save_multiple_fonts_agg_win.png delete mode 100644 testing/resources/embedder_tests/save_multiple_fonts_skia_linux.png delete mode 100644 testing/resources/embedder_tests/save_multiple_fonts_skia_mac.png delete mode 100644 testing/resources/embedder_tests/save_multiple_fonts_skia_win.png create mode 100644 testing/resources/embedder_tests/save_new_text.dump.txt delete mode 100644 testing/resources/embedder_tests/save_new_text_agg_linux.png delete mode 100644 testing/resources/embedder_tests/save_new_text_agg_mac.png delete mode 100644 testing/resources/embedder_tests/save_new_text_agg_win.png delete mode 100644 testing/resources/embedder_tests/save_new_text_skia_linux.png delete mode 100644 testing/resources/embedder_tests/save_new_text_skia_mac.png delete mode 100644 testing/resources/embedder_tests/save_new_text_skia_win.png diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp index 574bed3f0b..99e2fb769f 100644 --- a/fpdfsdk/fpdf_edit_embeddertest.cpp +++ b/fpdfsdk/fpdf_edit_embeddertest.cpp @@ -65,8 +65,6 @@ constexpr wchar_t kLoadedFontText[] = L"I am testing my loaded font, WEE."; constexpr char kLoadedTextPng[] = "loaded_text"; -constexpr char kRedRectanglePng[] = "red_rectangle"; - // In embedded_images.pdf. constexpr char kEmbeddedImage33Checksum[] = "cb3637934bb3b95a6e4ae1ea9eb9e56e"; constexpr char kEmbeddedImage33Png[] = "embedded_images_33"; @@ -483,10 +481,7 @@ TEST_F(FPDFEditEmbedderTest, AddPaths) { EXPECT_TRUE(FPDFPageObj_SetMatrix(red_rect, &matrix)); EXPECT_TRUE(FPDFPage_InsertObject(page.get(), red_rect)); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmap(page_bitmap.get(), kRedRectanglePng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), "red_rectangle"); // Now add to that a green rectangle with some medium alpha FPDF_PAGEOBJECT green_rect = FPDFPageObj_CreateNewRect(100, 100, 40, 40); @@ -545,10 +540,8 @@ TEST_F(FPDFEditEmbedderTest, AddPaths) { EXPECT_TRUE(FPDFPath_SetDrawMode(green_rect, FPDF_FILLMODE_WINDING, 0)); EXPECT_TRUE(FPDFPage_InsertObject(page.get(), green_rect)); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmap(page_bitmap.get(), "red_green_rectangles"); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "red_green_rectangles"); // Add a black triangle. FPDF_PAGEOBJECT black_path = FPDFPageObj_CreateNewPath(400, 100); @@ -584,10 +577,8 @@ TEST_F(FPDFEditEmbedderTest, AddPaths) { EXPECT_FALSE(FPDFPath_GetPathSegment(black_path, 3)); EXPECT_TRUE(FPDFPage_InsertObject(page.get(), black_path)); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmap(page_bitmap.get(), "red_green_rectangles_black_triangle"); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "red_green_rectangles_black_triangle"); // Now add a more complex blue path. FPDF_PAGEOBJECT blue_path = FPDFPageObj_CreateNewPath(200, 200); @@ -600,18 +591,13 @@ TEST_F(FPDFEditEmbedderTest, AddPaths) { EXPECT_TRUE(FPDFPath_BezierTo(blue_path, 375, 330, 390, 360, 400, 400)); EXPECT_TRUE(FPDFPath_Close(blue_path)); EXPECT_TRUE(FPDFPage_InsertObject(page.get(), blue_path)); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), "blue_path"); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), "blue_path"); // Now save the result, closing the page and document. EXPECT_TRUE(FPDFPage_GenerateContent(page.get())); EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - // Render the saved result. The images will change due to floating point - // precision error. - VerifySavedDocumentWithExpectationSuffix("blue_path"); + VerifySavedDocumentWithDisplayList("blue_path_saved"); } TEST_F(FPDFEditEmbedderTest, ClipPath) { @@ -749,26 +735,22 @@ TEST_F(FPDFEditEmbedderTest, Bug1549) { ASSERT_TRUE(OpenDocument("bug_1549.pdf")); ScopedPage page = LoadScopedPage(0); - { - ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get()); - CompareBitmap(bitmap.get(), "bug_1549"); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), "bug_1549"); - ScopedFPDFPageObject obj(FPDFPage_GetObject(page.get(), 0)); - ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj.get())); - ASSERT_TRUE(FPDFPage_RemoveObject(page.get(), obj.get())); - } + ScopedFPDFPageObject obj(FPDFPage_GetObject(page.get(), 0)); + ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj.get())); + ASSERT_TRUE(FPDFPage_RemoveObject(page.get(), obj.get())); ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); - { - ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get()); - CompareBitmap(bitmap.get(), "bug_1549_removed"); - } + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), + "bug_1549_removed"); ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + // TODO(crbug.com/42270554): Color should be 0xff00aeef instead of black, // TODO(crbug.com/42270554): Should be "bug_1549_removed". - VerifySavedDocument("bug_1549_incorrect"); + VerifySavedDocumentWithDisplayList("bug_1549_incorrect"); } TEST_F(FPDFEditEmbedderTest, SetText) { @@ -2598,20 +2580,14 @@ TEST_F(FPDFEditEmbedderTest, AddAndRemovePaths) { EXPECT_TRUE(FPDFPageObj_SetFillColor(red_rect, 255, 0, 0, 255)); EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect, FPDF_FILLMODE_ALTERNATE, 0)); EXPECT_TRUE(FPDFPage_InsertObject(page.get(), red_rect_deleter.release())); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmap(page_bitmap.get(), kRedRectanglePng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), "red_rectangle"); EXPECT_EQ(1, FPDFPage_CountObjects(page.get())); // Remove rectangle and verify it does not render anymore and the bitmap is // back to a blank one. EXPECT_TRUE(FPDFPage_RemoveObject(page.get(), red_rect)); red_rect_deleter.reset(red_rect); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmap(page_bitmap.get(), kBlankPage612By792Png); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), "blank_page_612x792"); EXPECT_EQ(0, FPDFPage_CountObjects(page.get())); // Trying to remove an object not in the page should return false. @@ -3551,9 +3527,6 @@ TEST_F(FPDFEditEmbedderTest, GraphicsData) { } TEST_F(FPDFEditEmbedderTest, DoubleGenerating) { - static constexpr char kRedRectangleAlphaPng[] = "red_rectangle_alpha"; - static constexpr char kBlueRectangleAlphaPng[] = "blue_rectangle_alpha"; - // Start with a blank page ScopedFPDFPage page(FPDFPage_New(CreateNewDocument(), 0, 612, 792)); @@ -3572,11 +3545,8 @@ TEST_F(FPDFEditEmbedderTest, DoubleGenerating) { EXPECT_THAT(graphics_dict->GetKeys(), UnorderedElementsAreArray({"FXE1", "FXE2"})); - // Check the bitmap - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmap(page_bitmap.get(), kRedRectangleAlphaPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "red_rectangle_alpha"); // Never mind, my new favorite color is blue, increase alpha. // The red graphics state goes away. @@ -3585,20 +3555,15 @@ TEST_F(FPDFEditEmbedderTest, DoubleGenerating) { EXPECT_THAT(graphics_dict->GetKeys(), UnorderedElementsAreArray({"FXE1", "FXE3"})); - // Check that bitmap displays changed content - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmap(page_bitmap.get(), kBlueRectangleAlphaPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "blue_rectangle_alpha"); // And now generate, without changes EXPECT_TRUE(FPDFPage_GenerateContent(page.get())); EXPECT_THAT(graphics_dict->GetKeys(), UnorderedElementsAreArray({"FXE1", "FXE3"})); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmap(page_bitmap.get(), kBlueRectangleAlphaPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "blue_rectangle_alpha"); // Add some text to the page, which starts out with no fonts. RetainPtr font_dict = @@ -5836,7 +5801,7 @@ TEST_F(FPDFEditEmbedderTest, FormModifyObject) { // Save the document to the internal buffer EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - VerifySavedDocument("form_object_with_image_removed_image"); + VerifySavedDocumentWithDisplayList("form_object_with_image_removed_image"); } TEST_F(FPDFEditEmbedderTest, Bug410996566) { diff --git a/fpdfsdk/fpdf_save_embeddertest.cpp b/fpdfsdk/fpdf_save_embeddertest.cpp index d7e849ae2e..58b817461d 100644 --- a/fpdfsdk/fpdf_save_embeddertest.cpp +++ b/fpdfsdk/fpdf_save_embeddertest.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "core/fxcrt/fx_coordinates.h" @@ -318,7 +319,6 @@ TEST_F(FPDFSaveEmbedderTest, IncrementalSaveWithModifications) { class FPDFSaveWithFontSubsetEmbedderTest : public FPDFSaveEmbedderTest { public: - static constexpr char kSaveNewTextFilename[] = "save_new_text"; static constexpr std::array kExpectedSingleTextAdded = { // "Hello, world!\r\n" 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\r', @@ -410,8 +410,8 @@ TEST_F(FPDFSaveWithFontSubsetEmbedderTest, SaveWithoutSubsetWithNewText) { ASSERT_NO_FATAL_FAILURE(InsertNewTextObject( page.get(), font.get(), text.get(), CFX_PointF(10.0f, 10.0f))); - ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap.get(), kSaveNewTextFilename); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), + "save_new_text"); // Verify the file size increase is larger when not subsetting the new text's // font. @@ -420,7 +420,7 @@ TEST_F(FPDFSaveWithFontSubsetEmbedderTest, SaveWithoutSubsetWithNewText) { EXPECT_EQ(5004u, GetString().size()); // Verify the text is visible. - VerifySavedDocumentWithExpectationSuffix(kSaveNewTextFilename); + VerifySavedDocumentWithDisplayList("save_new_text"); TestExtractedFont(kExpectedSingleTextAdded); } @@ -438,8 +438,8 @@ TEST_F(FPDFSaveWithFontSubsetEmbedderTest, SaveWithSubsetWithNewText) { ASSERT_NO_FATAL_FAILURE(InsertNewTextObject( page.get(), font.get(), text.get(), CFX_PointF(10.0f, 10.0f))); - ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap.get(), kSaveNewTextFilename); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), + "save_new_text"); // Verify the file size increase is smaller when subsetting the new text's // font, since text only contains a subset of the characters in the test font. @@ -448,7 +448,7 @@ TEST_F(FPDFSaveWithFontSubsetEmbedderTest, SaveWithSubsetWithNewText) { EXPECT_EQ(4454u, GetString().size()); // Verify the text is visible. - VerifySavedDocumentWithExpectationSuffix(kSaveNewTextFilename); + VerifySavedDocumentWithDisplayList("save_new_text"); TestExtractedFont(kExpectedSingleTextAdded); } @@ -475,9 +475,8 @@ TEST_F(FPDFSaveWithFontSubsetEmbedderTest, ASSERT_NO_FATAL_FAILURE(InsertNewTextObject( page.get(), font2.get(), text2.get(), CFX_PointF(10.0f, 150.0f))); - constexpr char kSaveMultipleFontsFilename[] = "save_multiple_fonts"; - ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap.get(), kSaveMultipleFontsFilename); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), + "save_multiple_fonts"); EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, FPDF_SUBSET_NEW_FONTS)); EXPECT_THAT(GetString(), StartsWith("%PDF-1.7\r\n")); @@ -486,7 +485,7 @@ TEST_F(FPDFSaveWithFontSubsetEmbedderTest, EXPECT_NEAR(GetString().size(), 12000u, 500u); // Verify the text is visible. - VerifySavedDocumentWithExpectationSuffix(kSaveMultipleFontsFilename); + VerifySavedDocumentWithDisplayList("save_multiple_fonts"); std::vector expected_multiple_text_added; expected_multiple_text_added.reserve(kExpectedSingleTextAdded.size() + diff --git a/testing/resources/embedder_tests/blank_page_612x792.dump.txt b/testing/resources/embedder_tests/blank_page_612x792.dump.txt new file mode 100644 index 0000000000..c12b8ef305 --- /dev/null +++ b/testing/resources/embedder_tests/blank_page_612x792.dump.txt @@ -0,0 +1,6 @@ +SaveState +SetBaseClip [0,0,612,792] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,792.0000) line(0.0000,0.0000) line(612.0000,0.0000) line(612.0000,792.0000) line(0.0000,792.0000,close)] +SaveState +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/blue_path.dump.txt b/testing/resources/embedder_tests/blue_path.dump.txt new file mode 100644 index 0000000000..c1c5aa1ec9 --- /dev/null +++ b/testing/resources/embedder_tests/blue_path.dump.txt @@ -0,0 +1,10 @@ +SaveState +SetBaseClip [0,0,612,792] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,792.0000) line(0.0000,0.0000) line(612.0000,0.0000) line(612.0000,792.0000) line(0.0000,792.0000,close)] +SaveState +FillRect [10,762,30,782] color=0xffff0000 +FillRect [100,652,140,692] color=0x8000ff00 +DrawPath fill=0xc8000000 stroke=0x00000000 rule=even-odd stroke_state=[none] matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,792.0000] points=[move(400.0000,100.0000) line(400.0000,200.0000) line(300.0000,100.0000,close)] +DrawPath fill=0xff0000ff stroke=0x00000000 rule=winding stroke_state=[none] matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,792.0000] points=[move(200.0000,200.0000) line(230.0000,230.0000) bezier(250.0000,250.0000) bezier(280.0000,280.0000) bezier(300.0000,300.0000) line(325.0000,325.0000) line(350.0000,325.0000) bezier(375.0000,330.0000) bezier(390.0000,360.0000) bezier(400.0000,400.0000,close)] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/blue_path_agg.png b/testing/resources/embedder_tests/blue_path_agg.png deleted file mode 100644 index c9522e431841d0fd4506874ecb0474cbd06e5737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2290 zcmds3YfM{Z7(UQ&k(CK66WfkBU_g*frGpZc!Q4)3*$@eVt|4sG_2_`Lutkc)=|Eyi z2^7bE{MeW`U0ql%1VOk)3CK8tu%`%u_PjF5{inTxEM-GptKaq%b}tIDl03is-U_WYHOjs9vT{;u@Rb@prr-c z+MvB1dV9fO0HYC1Cg|^nfdLpAg5hBp8G+GJ7#oA}ahR9@vl*tQz+!=!8JL}gxj9%| zgry}|UWP}H0MJDNAjfa~Mi5TwDDsW?vqrP=W*XyN5BcEGwr>`GKO^wgGHOENVp}Vc zLi#REUU^2;mg^w+xad}RS89zmr2Ago-kC8=_;yOBBvjrUH>S@)YA1(uL_t9(<$5=! zg0A`$1s@ustvI6P`u&Ku;wb!o($+j!y{&n$db3$y^=7kf_4eOS^Tl3lGe0%AYxASH zpK5%_qdxm&(Vx?%-1jVx->NlwFb6v_4Lp9c);Mjsa9Z3HfVg=H+Vz}{q9}HqhQ!=< zEc+85vP$)OuFzNIo+jz>_kAF8z3Ss@5}C^o%1yQkItvOV;`9Y+psqY+vf=!cXCFP3 z`@nOJOG3o`Wvl)YPoQ9}tt9`l_O+w9fn$2MDu1$s zU8i=%MGUz-f1N>EKah?mE%5Z?e68$xC`a=&e<;KiMl~;E=xjVXx!;|TUzjYGHNA+s zU3)!9gP*P=e-Y{wrlCI=QoNs#q`J3O`@M)X}O^L}i{a=~QzG z!RC&aEQcwQef7s6l}b{-H2odP*J*Eb<@s?gD5bxK;czj0cd6c)+njaoZuc#PZ*K6Ulza@(u@hUp^#%tw zj%u5tyu)py|Me_Vqc!woacGhaYtg^>yAG#Xex*Oyd*cNExEgAP%J!~w&WhFR g&nsR-mRrsf(b|aGFSxZ?=wF72;>D2PA9yGCZ_8AefdBvi diff --git a/testing/resources/embedder_tests/blue_path_saved.dump.txt b/testing/resources/embedder_tests/blue_path_saved.dump.txt new file mode 100644 index 0000000000..4264efc986 --- /dev/null +++ b/testing/resources/embedder_tests/blue_path_saved.dump.txt @@ -0,0 +1,10 @@ +SaveState +SetBaseClip [0,0,612,792] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,792.0000) line(0.0000,0.0000) line(612.0000,0.0000) line(612.0000,792.0000) line(0.0000,792.0000,close)] +SaveState +FillRect [10,762,30,782] color=0xffff0000 +FillRect [100,652,140,692] color=0x8000ff00 +DrawPath fill=0xc8000000 stroke=0x00000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,792.0000] points=[move(400.0000,100.0000) line(400.0000,200.0000) line(300.0000,100.0000) line(400.0000,100.0000,close)] +DrawPath fill=0xff0000ff stroke=0x00000000 rule=winding stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,0.0000,792.0000] points=[move(200.0000,200.0000) line(230.0000,230.0000) bezier(250.0000,250.0000) bezier(280.0000,280.0000) bezier(300.0000,300.0000) line(325.0000,325.0000) line(350.0000,325.0000) bezier(375.0000,330.0000) bezier(390.0000,360.0000) bezier(400.0000,400.0000) line(200.0000,200.0000,close)] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/blue_path_skia.png b/testing/resources/embedder_tests/blue_path_skia.png deleted file mode 100644 index 57a6e70e24ba76c9da072902707da192dc015480..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2518 zcmds33rtg27{1f;C{Qs}rC801ns!8%*)FBYDj976hXPZIY_3i=dlMfmAhJ~kC`u

{GPPcHflY*!f%rhFXs04tGCTQpPT8DGmY5|onx)BkeE)a8 z??30>`=4%_pE^enG&zW27(voI@o5Y*hGm$sqQJ2PNqawdJ?UP_OPix*>RYD_kg;@r za(V*8V9Xf!`5_JsFBIeCQN(xd_v0wpoI;5vVuSaGk3jziv3WDLZpHTPu-j2tS-EEq_U=V>HTLa8Z7mKQKwTXg8gTF+4jsbb z!#HsQEiE{83TMya+&NshfQ}Ayb>Y$_T)Bd)SJBsp>(_DP2KxKqa^dDp3=H7*ZMfaI za|d_tVsH@m?_+2P4B}ws`^!%TH=_y;Cu~3wF zwTd?}KB1*_;!IEZdcpX@mii6xR_{p8cj8r|PZuYRb1m9=uk}rttoYmC40Cf&@=B6z zNjAPhBh^T`863|p*(MRPCCN|2Jp0oyU-1Xq2MgJ-QT8b8lOXI-*r!a{e<@S;i!ppz z@_0TcZI2@l@yQln&L{96?ObC%_ExC<+LF(L6sH}I1a5*@{I<5n>5O_~q}*y<7O69t ziWvJ+Lti)v6|U0ObUO0|l)B6o6=QDuJh|@RUJ?Ccx3AVEYG# zz90FtolR(2i_6H0+ybg|jOyxD5}naBTOO%1x+ldRFLlp~XnwqgyEs|AOvuIeHO`}IV*r_xBDDi#KH4}FNH{=UFEdUY&t2RHWNY9@maJTDx`94?~=CrQ3P3@ zaWB!oOC#2ww1hNTlrc+o+4d{VMLyvs>a@>8b6Q+QU=K&t_FmS|edo}uw^8dmy`|J@ zkOoyUl4ooT-N5y6WH{BkR9kb=*)J0+svVAMD)<%kR;wd*D@}b?zCF#L-zj6~TBqU@ z%6$BjluW7~8?-eSoK-tJzYbx&teg9yTd3IRh-ocqzLq8F4lu0w=0Qj8nGMk@&pod( zGobOJb8Xv)y~@ykRRhZEV})^(hAa6JLx{p5X;1NX@N9Db2!m~toEvv|cQUi6M<9%I zh}e?vdAkfGWWPMqkA&s^UFF^up6&Fn`Y^UabM!&aYg#Ec`wY)MEayZPcV~7t4SxA5 zQPme@7y9(cmoqfQQX$t6J+h|1$Um4$NxAG^rO)Ji_7*v}(vYcT2>$x zhoff;wVX%9Z;?Fdu+2JcG;L4ZvkT}y)YW!eQrq^&co??Us;TJ_vFH8=9ge(*k1I6( zi*iB~+-ieOvqMZi39>oc4Tr=Mt@4i`2g*s#TL~rmMN;&!jlCk)IOk}nB z)U~^K+Xg~>a(fbKtU5v7sn8f<8QBQ#d+t$P@F7ZCr pd8J!dz)5cAPNkNRZvQvac;9(M8rrVPAqhI4*#<_z}7#Vcs W=Vj-5N1XubVDNPHb6Mw<&;$T`uqg)s diff --git a/testing/resources/embedder_tests/bug_1549_removed.dump.txt b/testing/resources/embedder_tests/bug_1549_removed.dump.txt new file mode 100644 index 0000000000..9877effa41 --- /dev/null +++ b/testing/resources/embedder_tests/bug_1549_removed.dump.txt @@ -0,0 +1,7 @@ +SaveState +SetBaseClip [0,0,100,150] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,150.0000) line(0.0000,0.0000) line(100.0000,0.0000) line(100.0000,150.0000) line(0.0000,150.0000,close)] +SaveState +FillRect [30,90,80,130] color=0xff00aeef +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/bug_1549_removed.png b/testing/resources/embedder_tests/bug_1549_removed.png deleted file mode 100644 index b20a5eaba91acc14c3b60425b86d088646f32c5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^DL_1pkr_w|mF;H*QjEnx?oJHr&dIz4a@YcVLR=Zv zz5oCJ|C3AaU4SBLo-U3d9> XuKc|0T<@q8KphO8u6{1-oD!M<>KrPQ diff --git a/testing/resources/embedder_tests/form_object_with_image_removed_image.dump.txt b/testing/resources/embedder_tests/form_object_with_image_removed_image.dump.txt new file mode 100644 index 0000000000..7c4f49e735 --- /dev/null +++ b/testing/resources/embedder_tests/form_object_with_image_removed_image.dump.txt @@ -0,0 +1,8 @@ +SaveState +SetBaseClip [0,0,200,300] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,300.0000) line(0.0000,0.0000) line(200.0000,0.0000) line(200.0000,300.0000) line(0.0000,300.0000,close)] +SaveState +SaveState +RestoreState +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/form_object_with_image_removed_image.png b/testing/resources/embedder_tests/form_object_with_image_removed_image.png deleted file mode 100644 index efd3b8d20d060e20067db3c16903176658f9c318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^Cm0wQbr_j}tUV@qe}NQZage(c!@6@aFM%B90G|-o z|Ns9lKOzlO$ROwG;usF!Z?9`IGAIZz9MtYyDBm_^0Y}5boi|yM&3~;ScZ$ zaWywLum4{^d-m-A3=IGO|G(0BM45qsWsawdV@SoVx0f7wTO1e;9N5~xZ1bSuLA>zJ z^Lsr!;wPkPC0;7jFcVO4ZsUOe#hcdNC;r@DI^4l^eH6butXCi`mjV3B>ISpCaOA~ zg&Hx7)xU49_pRBcw0bgcN~uvw<&Z#|$|viJ+uBKPvY|UF)!Veb9h`@$nh3V1+_qQ3 kh+>F6XC098`|SO~xr%PNob_j?1B);QPgg&ebxsLQ06=fHJOBUy diff --git a/testing/resources/embedder_tests/red_rectangle.dump.txt b/testing/resources/embedder_tests/red_rectangle.dump.txt new file mode 100644 index 0000000000..0f2c0ca2a0 --- /dev/null +++ b/testing/resources/embedder_tests/red_rectangle.dump.txt @@ -0,0 +1,7 @@ +SaveState +SetBaseClip [0,0,612,792] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,792.0000) line(0.0000,0.0000) line(612.0000,0.0000) line(612.0000,792.0000) line(0.0000,792.0000,close)] +SaveState +FillRect [10,762,30,782] color=0xffff0000 +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/red_rectangle.png b/testing/resources/embedder_tests/red_rectangle.png deleted file mode 100644 index 62a6986248cf00bd8ef30b2bcfbcec5dbd679462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 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 O3l{M}A6BVp7ydt_Rx@q@ diff --git a/testing/resources/embedder_tests/save_multiple_fonts_skia_linux.png b/testing/resources/embedder_tests/save_multiple_fonts_skia_linux.png deleted file mode 100644 index 8fdfab78c69dea12ed6065e23266cdb903ca8c0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3232 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 OD-HEbbt|=9@&5whh33Qn diff --git a/testing/resources/embedder_tests/save_multiple_fonts_skia_win.png b/testing/resources/embedder_tests/save_multiple_fonts_skia_win.png deleted file mode 100644 index 8544b0d61d95cffd1a4900b8ce6d6e9d61e6acc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1997 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 diff --git a/testing/resources/embedder_tests/save_new_text_agg_mac.png b/testing/resources/embedder_tests/save_new_text_agg_mac.png deleted file mode 100644 index bae02196b997b3bed704f70e88fe6f872837f6e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2778 zcmb`JS3Dbx8phKaA+beKzEoOU?Ur&ViI}lRt)@!F45<;bR!~(fvASZ_rWKp0lGZ3b zHKJx}bQw{j!w9W7{m$jNIv3~SegDtR`};jN@AG@oZLLjtL8n0g0D#xr3~B#|gZ~WI zp9Q$1`5o~GC&KJa5diY2Bm)2d<(VVlj#2c@`A8Rt?`gm{+{1-@6)*^{#)X8$iYj^a zx)8iFzMp63qV+xz$ak>2WbAbxX{av(E)@eu=yayZtYGE61dQ25z%fcv!&~1LTME(G z>qUhrU!s=`W+Nkfx*spaW4e`jlBi|^DN^h(E;tuLfbjp93DIUBhl0dKw&y~wB$VhX zA8i7Q)NMTkzMxBygx~8%Yqq0N`?T3fzVXPN~4-#js zeW}QvUGQdJ1t8tKi|9=p+VP+9lA7)hm&n$;G*oj$yQ&CFX;0$rH`5!{dunxQA475OUXeyafuMOEJdZww^q^ zP<_ep&E`VqzGf&&-k%WE&)t+UALl7lr)oA$_<9Zj7x0AfA!T?gkGI5hn&jrLAPH+P zQ|^i8u!lafKGY-{>blzO^@fJ7r=KT~Au5?*nN8W5mH5&|vw2e$@ULVn4^R+9;IPOh zpR+1N%?qdRis{=#(@8C(Nl_ZGuN3#c@`-+hLHk$5 zq-)rgQ!J^wxyGU~X%`S$npUAi-hIvxw)(ib&;;l?ivqU28@>bUK~3Bo(126ubLSp zI)fO($w$kU{E`9ns$3=+c(`||p0oCG&0y?-TaN0>#9Gr0Bl5u)i&$fx*g)geuK4bQ zitFWSqZ`@-rXkb`VQ3&L?;W$IPrBxZrp#oqQ0PxXSa&1he|j^b0jE7g7?_>`b!-%A z?@th|n35l?%yK`IB$m+Uvb2l1Emi+#;)gEXbv^cj4UCPu$)Wq6AGY@l~Opp(xncc>Zl$!guOjt!viCgx$ zQX@tP#9Qseul=GR5q|$DaYDEO9xDMp*9%iy4Ryc|nL2Mh^6t}gr)(#0BVf%KD+0SH z1ac{uVzr{G_OBjzFo|}NcH4v6@*V|r4obKK1*%CMW)=jw%}sc5{%9~A33Ow~K6Z8O zmz3@mlB(gRb{n4RS`45GJrV|}T_U6vIQfa0xmu1SL!K1OL`GEUagjLFpv@9HEee0B zjwOeyCUUMunRQ@v*`m9tvb@wf%Ew42AXR-oxo*0ynJ2zzemld{)h*3@t{gdMh_x`TvP2)+3G z?v1~tR7L_9D@)vfmLZ^-JG>p!xKSl^>Q2MFXTwURa1EsBw{I2Z#Dh)>w$u1}>!^*s z2~;lTzIPYuF=^)eRDW8|&8fyh z%jY4R9obeYp#mPs5B92+`4x5=Nuu)mC^Hx8L{s3rs75g*C8cFQzQ)ja_;kGXu+#&6 z(Tc3AySB3J^7Yib|< z9ARi>mm@u;Y}>}^T1_O32KCc;!5pryAP(z3CpnBvX<}%ss5hywDPV0Dg`gc{rtbX? zcC9NKU3wMjV4WM?3+703PpZr{Ug&8_86NR8}}?@?&dGM%jFjbE%=y{dbQx~YpG?K z3!0QFa4j?Q=;B~-MtWW~F|7bKW z>lfK?OYUj}J`-Eu*h;nOQsP0151@yvo5C~{Ef?pC`8>h~UbC<~XjB}R^p(+hA>h_g z7<2MnUL)*DZycsFm+`TXz9q%KysZ_o_%!-58*P`vcaN;Q{_4P12nCxmto) zL_`3&phLUQ$tKJ24CW-}>R`=Bd;h8%SDy}`F?Lv!RFu_>29cgEF>9tS#u}r%pZr9+ za_<)2$!ho}bBgmZZP#H>dmC87hs(nt2Y+7vI~jNs0gAk#d*)4Cb9C>*o6+43Qd~+S zE+TyC?Y>~p9ZZ0eKtKBtM`Jnlhx9^&o0><1PfWQOFJd!L5jO3KW0lrO8)|9NYG3a) zX~X!t9a~CX5Z8?bOST( z;*d7Hi!!I)t$;l+O*}41vg9e1=y}GiVwc*3N8&#RTrqFW`jsnw6d+HaFm?~r>kfk) zCBm3-1H=2|^aZ8(RNbGWX_#xB_wtxC50AOxx KjU*$k6aEc2ha*=2 diff --git a/testing/resources/embedder_tests/save_new_text_agg_win.png b/testing/resources/embedder_tests/save_new_text_agg_win.png deleted file mode 100644 index d99d14487d8e2b9b783d1ff424e02c407a99971e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2882 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 YzstR#Nu2C;``>4UKI>}VYlSjv z;YcWa2E~had+*fMNaOvTWZJx&Alu{YO1q)-czvOeFSLy6BnA=Z^VI-UGC4h1ux0ENk}TM3dUu6}xYn$aK=b%Zg4*>^h-lXbNkYAs>av^; z5Vl)pFgOh;Q1mH6F#FREQGT!=5DB%=?GnFNodKCca5UfQb(8*~dO9@Vt)p%kP>6mN7OV}B@u7PoS5Y- zfjC1H6w>{%ZT8W=jV=H;yNlvy%{A+fFr?=^{>jc7y^w#itn!1iGK}$l`GSK%&)oQ_ z-@$C89bl-41tygKDR>AB&phSc)u})hI0?<3PFTn_>qIn4!c7{1CE!!H*gMGrry~x# z;gOPVV81OQy#LjELYlD!)%91Pix#lDW{!taY}{$rC*XQnXwvJQ*)ZD-4X@H; zP`*&pnH1X}3ac+@%0_OcXv>&*r7|yF50jGy*f08Sx12*A68c&X5wEm460*pCEI5*T zRi(y=+lwz7Iw`N~xUuRmVr^FSrWt(pio9`4ZPjb+NVB<2unZ zT?3E#_+|5KP{e1_i@6^R@fv&jy^HSM-MJ#>-e(7M%#XNC?qGPj$R;;~k(@gz zvBXGrRa~pqsR*&W>A~{r$`p!1T-^Z~g?-LaRtu6vs#?q6%7YH` zC|V)>>Ji-gjq13|SfBX44fDhZ*yv9|{>`x+8yu^`HaD0q5W(u zv1-mjPyEDqT)O=Unfl_*JOmw<$2TMJ(AX=-pSy-X|$+ zEcKYNEoeiuFm<_eRnJLzDC%35fp6^CgIQ-EG&yr%#Mo?ly*ld4r6ff$pHNcgTN^(2 zDk{KBur6uDuKC)*Z>59}3$hJb@0q@qiA{3M?1C#T>(vq{BMIjqzrVZ=ke`&IH&asKCMGfw8MOdE;99Y_HI)f=Z0zz zzAz-FP{E}^;hh=V+uKLy84Q>EEpQ*qPlD6VZt&Sw!tBArH@v$(VcLV7rCE%!d5LvS z`Y0E>8=-6g@d0eIHbwI8#wML|wzLSPwBEwKX?eAMP@3!!O)Ir66HC`ql&&w&#Xs-o z?hF4KIo1%XIP2_xfs_lPcYQ_$s^dHj+npADK1NyX=@n8~JWb$@qWeR&bHlDKF#h^(hD0RFu_RGR)pyQVLqVJ1x~{n40#zvn7!xKai*OC@$rvMXf+UZs)EH zQQG0mOi_71BT!C(q9C!}BNwnA(5a1T*1_3Kmt{G7)>dt?PXtmOw_t+W->;eYq-*Bq ztjQ7pA-E?AjBUIVW+%A6VyOSF=tTLur|ZSZ8pIpS;(=C^DbT3zkr1c;sfL{tLX(jP zk=CN!witY<|2o9Kx~htneY5g1Au^*N%Wq~mJZlLLof}R_J71g*dP~tGXl{!y4-aeE zS0gr?@9%9BvQoMEOkC%xiUL(EqHR_!ebu=mhiif(xq9zs1rPAhrKNqesb)ED{l4RZ z{)3-PoEIQJnH?y*wxJK7ua3X_Sp43zmo(wAHV}{oF#l_jHJM zj+Tl4z8)#Rc4ej&D{|eUgaJ9Mo!{o4JLb~w5!K-pU+KCbLpSN05sBb(4eYUx-pFin()4!l-uq}W@b!4Z2^u{2M<|or zQmJJj5l|GI>~!%e*?L#a*79@zpq+E?rUL0O;!AtfjCw>gRndE`#Zo}#bJO{trObH} zSN^2NJv3Ewa{QZU<&vioV!ZNbt$hXQ`4%EK=TrG;e^yXpYH75zvTs@6OXTRMA6qrE z@wqDI5HvEc{#V}Zk(NL*h1phT`=t>-9JtC{S|#}27!TJqD^4Ai> zLVwqs4Bq^6g6Qx*;0@zRzYN$=>MkuJ{WgYySSmTzP*M)_8$C>R_*J9Cx^Dg8Y?Rpx zP}4~zu68c3VbKJb^Ay@PyG@%{4jsEohYJ3^1iWSkp3?J#* ze7(sQbU^jo&>0)Us6@?R-WmPKG5+@t9?<(v0QN<$iN3aO{~T9#QZe*j%g BB@F-o diff --git a/testing/resources/embedder_tests/save_new_text_skia_win.png b/testing/resources/embedder_tests/save_new_text_skia_win.png deleted file mode 100644 index bc6a3ed3c3915618c32463e72a7a4ea0e7489b23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1531 zcmb_cYdDh&0RGTAbKfc|mu$1-e$7y4T5H;dgyYi4X_atTDdA`sGNH@*ww^qZDA$S@ zhe>4GQK7k2?nC7|ZS5$d5<7K%o?qw3`SD(UzR&Z%&ztS-MbuQ&Qv(1%lT0G`e%JON zfPN<+%V7Zz01yG0u-7kPL@MgKK4}hvyt%pYD5!!2mEhczOu$@8s+x*bis;E(O;%q_ zUzOCXTycEmP(D=GM8qeR-N%g$q^6M5@tcZZ8KwlJnorjMZ9%>v2TR2#Gmb&Ts|r4s zI!`*SgGTk|VLOeqC?J{Ry7m^f`zm)=t3T%w1aF+1>W!lpYD(NUlkA;+H7fJVF@CjF zr2as$u?*sG8yBlnG8txDvmBx4po^I$*vp2Hdx(69|Vbjh$ z;l;lB*RO&Ml21kSAmn)Ht=;7_s^}irNa>9xP(%;%Eh?dX(ctXOsX&~w;6vh=Ntu^N z{Je<~L~vX1fNkTJj+R@P`b{B6f`=*HR-N;yT#iuJB)*o2*i=`;dUzdu%kV{hhU!T@ zN~W>6x16Qb-q)7_R`bqnMU$T&5xFXht@0Sbt&>KoY^#<<#(!=9BZRb$sk<_()HlU9 zvTuwUg>y@~Cc^g@fr~4twBt!G52a9#ulK?C2tcbH9#uJco!FgP3Pg;;b1qBu_X0q! z-7lf(ZSB02b{pc$Yc+T5_K!T1LK#l&7~^d?5u(M*M zCkZKp&oDtWG<$(5yz?|N>JLHY9l6yY9Oze30O!8pcx?Jhr%%sAtUwm>` zJ$R=4aCYy3;(xFD8-~;~ecyt21fUGA`a{MaQJ=1PmOuSE08y7rgBQ=*!r#ttn*vyW z=Byqbop?mWH8b|VGowV8uLJK58`kbQad~Pv&}JKsmT-24VNFE!u145SMvWjotvps7 zfsG*{&Tz8r1}Y)+%Yq#B=9|dcJwCcK1lDN83?N9xs3#g=_K3&A#T8a>bz0q*!2q#F z_-(H)&8${O`&=QU=Gxf9Kpm7|c~sN{#dD%u)O;98Pq1|#*^YMES?kz=ZXZ5mFIynT zXmI<@C=zx-hqObKAf#)me8fCVw9T4c0A;oKIzPoi~*a&-Jx z=0rN-c4t?jPjwnv)|F7b5%J*$Xs$g%DwN*Deq2ArS8`fk(1jnS%LDOcJFVA;C$ou@ zF+CMx2Wa403{>Tmx@X17wb^2|3>)3T#4NtR@G+ZV$TAsR`? zF|X#Qy~%W@mBmOwi?)-p49}C@S2?EGS(2Sb+11f6sB%igrUa%uzc|O0naP%f+Q{SD z;U*-vyTd~V_x;RObnu&!sj7czgt@P8wA>hD+2t1C0%1FEZqj#dE`6F={16lEj8s4cf_Ds4~#sQ Date: Wed, 14 Oct 2026 17:37:24 -0700 Subject: [PATCH 32/37] Use display lists for text addition and positioning tests Replace fragile golden PNG image comparisons in FPDFEditEmbedderTest for text addition, font loading, and glyph positioning tests with display list inspections. Support UTF-8 multi-byte decoding in ExtractTextLinesFromDisplayList to verify non-ASCII and CID font text directly. Delete 46 obsolete golden PNG expectation files. Change-Id: Ib10a4210ee33aeccd315d1ca0f0b54187925efaa Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160350 Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- fpdfsdk/fpdf_edit_embeddertest.cpp | 124 ++++++------------ .../embedder_tests/bottom_text.dump.txt | 7 + ...ext_added_bold_and_stretched_text.dump.txt | 9 ++ ...text_added_bold_and_stretched_text_agg.png | Bin 8248 -> 0 bytes ..._added_bold_and_stretched_text_agg_mac.png | Bin 7514 -> 0 bytes ...ded_bold_and_stretched_text_skia_linux.png | Bin 7173 -> 0 bytes ...added_bold_and_stretched_text_skia_mac.png | Bin 6979 -> 0 bytes ...d_bold_and_stretched_text_skia_mac_x86.png | Bin 6979 -> 0 bytes ...added_bold_and_stretched_text_skia_win.png | Bin 5219 -> 0 bytes .../bottom_text_added_bold_text.dump.txt | 8 ++ .../bottom_text_added_bold_text_agg.png | Bin 3940 -> 0 bytes .../bottom_text_added_bold_text_agg_mac.png | Bin 3798 -> 0 bytes ...bottom_text_added_bold_text_skia_linux.png | Bin 3447 -> 0 bytes .../bottom_text_added_bold_text_skia_mac.png | Bin 3580 -> 0 bytes .../bottom_text_added_bold_text_skia_win.png | Bin 2602 -> 0 bytes .../embedder_tests/bottom_text_agg.png | Bin 2541 -> 0 bytes .../embedder_tests/bottom_text_agg_mac.png | Bin 2549 -> 0 bytes .../embedder_tests/bottom_text_skia_linux.png | Bin 2325 -> 0 bytes .../embedder_tests/bottom_text_skia_mac.png | Bin 2439 -> 0 bytes .../embedder_tests/bottom_text_skia_win.png | Bin 1478 -> 0 bytes .../embedder_tests/bug_410996566.dump.txt | 7 + .../embedder_tests/bug_410996566.png | Bin 723 -> 0 bytes .../embedder_tests/bug_410996566_agg_mac.png | Bin 679 -> 0 bytes .../embedder_tests/bug_410996566_skia.png | Bin 633 -> 0 bytes .../embedder_tests/bug_410996566_skia_mac.png | Bin 658 -> 0 bytes .../embedder_tests/bug_410996566_skia_win.png | Bin 388 -> 0 bytes .../japanese_cid_font_text.dump.txt | 8 ++ .../japanese_cid_font_text_agg.png | Bin 4036 -> 0 bytes .../japanese_cid_font_text_skia.png | Bin 3659 -> 0 bytes .../embedder_tests/loaded_text.dump.txt | 7 + .../embedder_tests/loaded_text_agg.png | Bin 2675 -> 0 bytes .../embedder_tests/loaded_text_agg_mac.png | Bin 2663 -> 0 bytes .../embedder_tests/loaded_text_skia_linux.png | Bin 2437 -> 0 bytes .../embedder_tests/loaded_text_skia_mac.png | Bin 2560 -> 0 bytes .../embedder_tests/loaded_text_skia_win.png | Bin 1557 -> 0 bytes .../set_positions_bengali2.dump.txt | 7 + .../embedder_tests/set_positions_bengali2.png | Bin 1081 -> 0 bytes .../set_positions_bengali2_skia.png | Bin 2493 -> 0 bytes .../set_positions_bengali2_skia_mac.png | Bin 1081 -> 0 bytes .../set_positions_bengali2_skia_win.png | Bin 720 -> 0 bytes .../set_positions_bengali3.dump.txt | 9 ++ .../embedder_tests/set_positions_bengali3.png | Bin 1083 -> 0 bytes .../set_positions_bengali3_skia.png | Bin 2590 -> 0 bytes .../set_positions_bengali3_skia_mac.png | Bin 1097 -> 0 bytes .../set_positions_bengali3_skia_mac_x86.png | Bin 1084 -> 0 bytes .../set_positions_bengali3_skia_win.png | Bin 752 -> 0 bytes .../truetype_font_text.dump.txt | 8 ++ .../embedder_tests/truetype_font_text_agg.png | Bin 3610 -> 0 bytes .../truetype_font_text_agg_mac.png | Bin 3538 -> 0 bytes .../truetype_font_text_skia_linux.png | Bin 3163 -> 0 bytes .../truetype_font_text_skia_mac.png | Bin 3319 -> 0 bytes .../truetype_font_text_skia_win.png | Bin 2424 -> 0 bytes .../vertical_text_positioned.dump.txt | 9 ++ .../vertical_text_positioned.png | Bin 861 -> 0 bytes .../vertical_text_positioned_skia.png | Bin 816 -> 0 bytes .../vertical_text_positioned_skia_mac.png | Bin 874 -> 0 bytes .../vertical_text_positioned_skia_win.png | Bin 650 -> 0 bytes 57 files changed, 116 insertions(+), 87 deletions(-) create mode 100644 testing/resources/embedder_tests/bottom_text.dump.txt create mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text.dump.txt delete mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_agg.png delete mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_agg_mac.png delete mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_skia_linux.png delete mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_skia_mac.png delete mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_skia_mac_x86.png delete mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_skia_win.png create mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_text.dump.txt delete mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_text_agg.png delete mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_text_agg_mac.png delete mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_text_skia_linux.png delete mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_text_skia_mac.png delete mode 100644 testing/resources/embedder_tests/bottom_text_added_bold_text_skia_win.png delete mode 100644 testing/resources/embedder_tests/bottom_text_agg.png delete mode 100644 testing/resources/embedder_tests/bottom_text_agg_mac.png delete mode 100644 testing/resources/embedder_tests/bottom_text_skia_linux.png delete mode 100644 testing/resources/embedder_tests/bottom_text_skia_mac.png delete mode 100644 testing/resources/embedder_tests/bottom_text_skia_win.png create mode 100644 testing/resources/embedder_tests/bug_410996566.dump.txt delete mode 100644 testing/resources/embedder_tests/bug_410996566.png delete mode 100644 testing/resources/embedder_tests/bug_410996566_agg_mac.png delete mode 100644 testing/resources/embedder_tests/bug_410996566_skia.png delete mode 100644 testing/resources/embedder_tests/bug_410996566_skia_mac.png delete mode 100644 testing/resources/embedder_tests/bug_410996566_skia_win.png create mode 100644 testing/resources/embedder_tests/japanese_cid_font_text.dump.txt delete mode 100644 testing/resources/embedder_tests/japanese_cid_font_text_agg.png delete mode 100644 testing/resources/embedder_tests/japanese_cid_font_text_skia.png create mode 100644 testing/resources/embedder_tests/loaded_text.dump.txt delete mode 100644 testing/resources/embedder_tests/loaded_text_agg.png delete mode 100644 testing/resources/embedder_tests/loaded_text_agg_mac.png delete mode 100644 testing/resources/embedder_tests/loaded_text_skia_linux.png delete mode 100644 testing/resources/embedder_tests/loaded_text_skia_mac.png delete mode 100644 testing/resources/embedder_tests/loaded_text_skia_win.png create mode 100644 testing/resources/embedder_tests/set_positions_bengali2.dump.txt delete mode 100644 testing/resources/embedder_tests/set_positions_bengali2.png delete mode 100644 testing/resources/embedder_tests/set_positions_bengali2_skia.png delete mode 100644 testing/resources/embedder_tests/set_positions_bengali2_skia_mac.png delete mode 100644 testing/resources/embedder_tests/set_positions_bengali2_skia_win.png create mode 100644 testing/resources/embedder_tests/set_positions_bengali3.dump.txt delete mode 100644 testing/resources/embedder_tests/set_positions_bengali3.png delete mode 100644 testing/resources/embedder_tests/set_positions_bengali3_skia.png delete mode 100644 testing/resources/embedder_tests/set_positions_bengali3_skia_mac.png delete mode 100644 testing/resources/embedder_tests/set_positions_bengali3_skia_mac_x86.png delete mode 100644 testing/resources/embedder_tests/set_positions_bengali3_skia_win.png create mode 100644 testing/resources/embedder_tests/truetype_font_text.dump.txt delete mode 100644 testing/resources/embedder_tests/truetype_font_text_agg.png delete mode 100644 testing/resources/embedder_tests/truetype_font_text_agg_mac.png delete mode 100644 testing/resources/embedder_tests/truetype_font_text_skia_linux.png delete mode 100644 testing/resources/embedder_tests/truetype_font_text_skia_mac.png delete mode 100644 testing/resources/embedder_tests/truetype_font_text_skia_win.png create mode 100644 testing/resources/embedder_tests/vertical_text_positioned.dump.txt delete mode 100644 testing/resources/embedder_tests/vertical_text_positioned.png delete mode 100644 testing/resources/embedder_tests/vertical_text_positioned_skia.png delete mode 100644 testing/resources/embedder_tests/vertical_text_positioned_skia_mac.png delete mode 100644 testing/resources/embedder_tests/vertical_text_positioned_skia_win.png diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp index 99e2fb769f..a6a762654d 100644 --- a/fpdfsdk/fpdf_edit_embeddertest.cpp +++ b/fpdfsdk/fpdf_edit_embeddertest.cpp @@ -59,12 +59,8 @@ namespace { constexpr wchar_t kBottomText[] = L"I'm at the bottom of the page"; -constexpr char kBottomTextPng[] = "bottom_text"; - constexpr wchar_t kLoadedFontText[] = L"I am testing my loaded font, WEE."; -constexpr char kLoadedTextPng[] = "loaded_text"; - // In embedded_images.pdf. constexpr char kEmbeddedImage33Checksum[] = "cb3637934bb3b95a6e4ae1ea9eb9e56e"; constexpr char kEmbeddedImage33Png[] = "embedded_images_33"; @@ -846,14 +842,10 @@ TEST_F(FPDFEditEmbedderTest, SetPositions) { } ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); - static constexpr char kExpected[] = "bug_410996566"; - { - ScopedFPDFBitmap bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap.get(), kExpected); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), "bug_410996566"); ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - VerifySavedDocumentWithExpectationSuffix(kExpected); + VerifySavedDocumentWithDisplayList("bug_410996566"); } TEST_F(FPDFEditEmbedderTest, SetPositionsZeroFontSize) { @@ -906,17 +898,13 @@ TEST_F(FPDFEditEmbedderTest, SetPositionsVertical) { }); ASSERT_TRUE(FPDFText_SetPositions(page_object, kAbsolutePositions.data(), kAbsolutePositions.size())); - - static constexpr char kExpected[] = "vertical_text_positioned"; - { - ScopedFPDFBitmap bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap.get(), kExpected, - kFuzzyDiffOptions); - } ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); + CompareDisplayList(RenderPageToDisplayList(page.get()), + "vertical_text_positioned"); + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - VerifySavedDocumentWithExpectationSuffix(kExpected, kFuzzyDiffOptions); + VerifySavedDocumentWithDisplayList("vertical_text_positioned"); } TEST_F(FPDFEditEmbedderTest, SetPositionsBengali2) { @@ -957,12 +945,11 @@ TEST_F(FPDFEditEmbedderTest, SetPositionsBengali2) { EXPECT_TRUE(FPDFPage_GenerateContent(page.get())); - static constexpr char kExpected[] = "set_positions_bengali2"; - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), kExpected); + CompareDisplayList(RenderPageToDisplayList(page.get()), + "set_positions_bengali2"); ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - VerifySavedDocumentWithExpectationSuffix(kExpected); + VerifySavedDocumentWithDisplayList("set_positions_bengali2"); } TEST_F(FPDFEditEmbedderTest, SetPositionsBengali3) { @@ -1041,13 +1028,11 @@ TEST_F(FPDFEditEmbedderTest, SetPositionsBengali3) { EXPECT_TRUE(FPDFPage_GenerateContent(page.get())); - static constexpr char kExpected[] = "set_positions_bengali3"; - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), kExpected, - kFuzzyDiffOptions); + CompareDisplayList(RenderPageToDisplayList(page.get()), + "set_positions_bengali3"); ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - VerifySavedDocumentWithExpectationSuffix(kExpected); + VerifySavedDocumentWithDisplayList("set_positions_bengali3"); } TEST_F(FPDFEditEmbedderTest, SetCharcodesBadParams) { @@ -2849,13 +2834,9 @@ TEST_F(FPDFEditEmbedderTest, AddStandardFontText) { EXPECT_TRUE(FPDFPageObj_SetMatrix(text_object1, &kMatrix1)); EXPECT_TRUE(FPDFPage_InsertObject(page.get(), text_object1)); EXPECT_TRUE(FPDFPage_GenerateContent(page.get())); - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), kBottomTextPng); - - EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - VerifySavedDocumentWithExpectationSuffix(kBottomTextPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), "bottom_text"); + EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + VerifySavedDocumentWithDisplayList("bottom_text"); // Try another font FPDF_PAGEOBJECT text_object2 = @@ -2867,16 +2848,10 @@ TEST_F(FPDFEditEmbedderTest, AddStandardFontText) { FPDFPageObj_Transform(text_object2, 1, 0, 0, 1, 100, 600); EXPECT_TRUE(FPDFPage_InsertObject(page.get(), text_object2)); EXPECT_TRUE(FPDFPage_GenerateContent(page.get())); - { - static constexpr char kBottomTextAddedBoldTextPng[] = - "bottom_text_added_bold_text"; - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - kBottomTextAddedBoldTextPng); - - EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - VerifySavedDocumentWithExpectationSuffix(kBottomTextAddedBoldTextPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "bottom_text_added_bold_text"); + EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + VerifySavedDocumentWithDisplayList("bottom_text_added_bold_text"); // And some randomly transformed text FPDF_PAGEOBJECT text_object3 = @@ -2887,17 +2862,11 @@ TEST_F(FPDFEditEmbedderTest, AddStandardFontText) { FPDFPageObj_Transform(text_object3, 1, 1.5, 2, 0.5, 200, 200); EXPECT_TRUE(FPDFPage_InsertObject(page.get(), text_object3)); EXPECT_TRUE(FPDFPage_GenerateContent(page.get())); - { - static constexpr char kBottomTextAddedBoldAndStretchedTextPng[] = - "bottom_text_added_bold_and_stretched_text"; - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - kBottomTextAddedBoldAndStretchedTextPng); - - EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - VerifySavedDocumentWithExpectationSuffix( - kBottomTextAddedBoldAndStretchedTextPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "bottom_text_added_bold_and_stretched_text"); + EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + VerifySavedDocumentWithDisplayList( + "bottom_text_added_bold_and_stretched_text"); FS_MATRIX matrix; @@ -3423,8 +3392,7 @@ TEST_F(FPDFEditEmbedderTest, AddStandardFontText2) { EXPECT_TRUE(FPDFText_SetText(text_object, text.get())); FPDFPageObj_Transform(text_object, 1, 0, 0, 1, 20, 20); EXPECT_TRUE(FPDFPage_InsertObject(page.get(), text_object)); - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), kBottomTextPng); + CompareDisplayList(RenderPageToDisplayList(page.get()), "bottom_text"); } TEST_F(FPDFEditEmbedderTest, LoadStandardFonts) { @@ -3774,8 +3742,7 @@ TEST_F(FPDFEditEmbedderTest, AddTrueTypeFontText) { EXPECT_TRUE(FPDFText_SetText(text_object, text.get())); FPDFPageObj_Transform(text_object, 1, 0, 0, 1, 400, 400); EXPECT_TRUE(FPDFPage_InsertObject(page.get(), text_object)); - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), kLoadedTextPng); + CompareDisplayList(RenderPageToDisplayList(page.get()), "loaded_text"); // Add some more text, same font FPDF_PAGEOBJECT text_object2 = @@ -3785,14 +3752,12 @@ TEST_F(FPDFEditEmbedderTest, AddTrueTypeFontText) { FPDFPageObj_Transform(text_object2, 1, 0, 0, 1, 200, 200); EXPECT_TRUE(FPDFPage_InsertObject(page.get(), text_object2)); } - static constexpr char kTruetypeFontTextPng[] = "truetype_font_text"; - ScopedFPDFBitmap page_bitmap2 = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap2.get(), kTruetypeFontTextPng); + CompareDisplayList(RenderPageToDisplayList(page.get()), "truetype_font_text"); EXPECT_TRUE(FPDFPage_GenerateContent(page.get())); EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - VerifySavedDocumentWithExpectationSuffix(kTruetypeFontTextPng); + VerifySavedDocumentWithDisplayList("truetype_font_text"); } TEST_F(FPDFEditEmbedderTest, TransformAnnot) { @@ -3854,19 +3819,14 @@ TEST_F(FPDFEditEmbedderTest, AddCIDFontText) { EXPECT_TRUE(FPDFPage_InsertObject(page.get(), text_object2)); } - // Check that the text renders properly. - static constexpr char kJapaneseCidFontTextPng[] = "japanese_cid_font_text"; - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), - kJapaneseCidFontTextPng); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), + "japanese_cid_font_text"); // Save the document. EXPECT_TRUE(FPDFPage_GenerateContent(page.get())); EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - VerifySavedDocumentWithExpectationSuffix(kJapaneseCidFontTextPng); + VerifySavedDocumentWithDisplayList("japanese_cid_font_text"); } #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) @@ -4334,11 +4294,8 @@ TEST_F(FPDFEditEmbedderTest, AddMarkedText) { EXPECT_EQ(kBlobLen, out_buffer_len); EXPECT_EQ(pdfium::span(kBlobData), blob_buffer); - // Render and check the bitmap is the expected one. - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), kLoadedTextPng); - } + // Render and check the display list is the expected one. + CompareDisplayList(RenderPageToDisplayList(page.get()), "loaded_text"); // Now save the result. EXPECT_EQ(1, FPDFPage_CountObjects(page.get())); @@ -4404,11 +4361,8 @@ TEST_F(FPDFEditEmbedderTest, AddMarkedTextWithFloat) { EXPECT_TRUE(FPDFPageObjMark_GetParamFloatValue(mark, "Pi", &float_value)); EXPECT_FLOAT_EQ(3.14159f, float_value); - // Render and check the bitmap is the expected one. - { - ScopedFPDFBitmap page_bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(page_bitmap.get(), kLoadedTextPng); - } + // Render and check the display list is the expected one. + CompareDisplayList(RenderPageToDisplayList(page.get()), "loaded_text"); // Now save the result. EXPECT_EQ(1, FPDFPage_CountObjects(page.get())); @@ -5815,14 +5769,10 @@ TEST_F(FPDFEditEmbedderTest, Bug410996566) { } ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); - static constexpr char kExpected[] = "bug_410996566"; - { - ScopedFPDFBitmap bitmap = RenderPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap.get(), kExpected); - } + CompareDisplayList(RenderPageToDisplayList(page.get()), "bug_410996566"); ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - VerifySavedDocumentWithExpectationSuffix(kExpected); + VerifySavedDocumentWithDisplayList("bug_410996566"); } TEST_F(FPDFEditEmbedderTest, Bug461845674) { diff --git a/testing/resources/embedder_tests/bottom_text.dump.txt b/testing/resources/embedder_tests/bottom_text.dump.txt new file mode 100644 index 0000000000..49bb915338 --- /dev/null +++ b/testing/resources/embedder_tests/bottom_text.dump.txt @@ -0,0 +1,7 @@ +SaveState +SetBaseClip [0,0,612,792] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,792.0000) line(0.0000,0.0000) line(612.0000,0.0000) line(612.0000,792.0000) line(0.0000,792.0000,close)] +SaveState +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,20.0000,772.0000] glyphs=[(idx=44,u=U+0049,origin=(0.0000,0.0000)) (idx=10,u=U+0027,origin=(3.3360,0.0000)) (idx=80,u=U+006D,origin=(5.6280,0.0000)) (idx=3,u=U+0020,origin=(15.6240,0.0000)) (idx=68,u=U+0061,origin=(18.9600,0.0000)) (idx=87,u=U+0074,origin=(25.6320,0.0000)) (idx=3,u=U+0020,origin=(28.9680,0.0000)) (idx=87,u=U+0074,origin=(32.3040,0.0000)) (idx=75,u=U+0068,origin=(35.6400,0.0000)) (idx=72,u=U+0065,origin=(42.3120,0.0000)) (idx=3,u=U+0020,origin=(48.9840,0.0000)) (idx=69,u=U+0062,origin=(52.3200,0.0000)) (idx=82,u=U+006F,origin=(58.9920,0.0000)) (idx=87,u=U+0074,origin=(65.6640,0.0000)) (idx=87,u=U+0074,origin=(69.0000,0.0000)) (idx=82,u=U+006F,origin=(72.3360,0.0000)) (idx=80,u=U+006D,origin=(79.0080,0.0000)) (idx=3,u=U+0020,origin=(89.0040,0.0000)) (idx=82,u=U+006F,origin=(92.3400,0.0000)) (idx=73,u=U+0066,origin=(99.0120,0.0000)) (idx=3,u=U+0020,origin=(102.3480,0.0000)) (idx=87,u=U+0074,origin=(105.6840,0.0000)) (idx=75,u=U+0068,origin=(109.0200,0.0000)) (idx=72,u=U+0065,origin=(115.6920,0.0000)) (idx=3,u=U+0020,origin=(122.3640,0.0000)) (idx=83,u=U+0070,origin=(125.7000,0.0000)) (idx=68,u=U+0061,origin=(132.3720,0.0000)) (idx=74,u=U+0067,origin=(139.0440,0.0000)) (idx=72,u=U+0065,origin=(145.7160,0.0000))] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text.dump.txt b/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text.dump.txt new file mode 100644 index 0000000000..0943ef31db --- /dev/null +++ b/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text.dump.txt @@ -0,0 +1,9 @@ +SaveState +SetBaseClip [0,0,612,792] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,792.0000) line(0.0000,0.0000) line(612.0000,0.0000) line(612.0000,792.0000) line(0.0000,792.0000,close)] +SaveState +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,20.0000,772.0000] glyphs=[(idx=44,u=U+0049,origin=(0.0000,0.0000)) (idx=10,u=U+0027,origin=(3.3360,0.0000)) (idx=80,u=U+006D,origin=(5.6280,0.0000)) (idx=3,u=U+0020,origin=(15.6240,0.0000)) (idx=68,u=U+0061,origin=(18.9600,0.0000)) (idx=87,u=U+0074,origin=(25.6320,0.0000)) (idx=3,u=U+0020,origin=(28.9680,0.0000)) (idx=87,u=U+0074,origin=(32.3040,0.0000)) (idx=75,u=U+0068,origin=(35.6400,0.0000)) (idx=72,u=U+0065,origin=(42.3120,0.0000)) (idx=3,u=U+0020,origin=(48.9840,0.0000)) (idx=69,u=U+0062,origin=(52.3200,0.0000)) (idx=82,u=U+006F,origin=(58.9920,0.0000)) (idx=87,u=U+0074,origin=(65.6640,0.0000)) (idx=87,u=U+0074,origin=(69.0000,0.0000)) (idx=82,u=U+006F,origin=(72.3360,0.0000)) (idx=80,u=U+006D,origin=(79.0080,0.0000)) (idx=3,u=U+0020,origin=(89.0040,0.0000)) (idx=82,u=U+006F,origin=(92.3400,0.0000)) (idx=73,u=U+0066,origin=(99.0120,0.0000)) (idx=3,u=U+0020,origin=(102.3480,0.0000)) (idx=87,u=U+0074,origin=(105.6840,0.0000)) (idx=75,u=U+0068,origin=(109.0200,0.0000)) (idx=72,u=U+0065,origin=(115.6920,0.0000)) (idx=3,u=U+0020,origin=(122.3640,0.0000)) (idx=83,u=U+0070,origin=(125.7000,0.0000)) (idx=68,u=U+0061,origin=(132.3720,0.0000)) (idx=74,u=U+0067,origin=(139.0440,0.0000)) (idx=72,u=U+0065,origin=(145.7160,0.0000))] +DrawDeviceText font="Tinos" size=15.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,192.0000] glyphs=[(idx=43,u=U+0048,origin=(0.0000,0.0000)) (idx=76,u=U+0069,origin=(11.6700,0.0000)) (idx=15,u=U+002C,origin=(15.8400,0.0000)) (idx=3,u=U+0020,origin=(19.5900,0.0000)) (idx=44,u=U+0049,origin=(23.3400,0.0000)) (idx=10,u=U+0027,origin=(29.1750,0.0000)) (idx=80,u=U+006D,origin=(33.3450,0.0000)) (idx=3,u=U+0020,origin=(45.8400,0.0000)) (idx=37,u=U+0042,origin=(49.5900,0.0000)) (idx=82,u=U+006F,origin=(59.5950,0.0000)) (idx=79,u=U+006C,origin=(67.0950,0.0000)) (idx=71,u=U+0064,origin=(71.2650,0.0000)) (idx=17,u=U+002E,origin=(79.6050,0.0000)) (idx=3,u=U+0020,origin=(83.3550,0.0000)) (idx=55,u=U+0054,origin=(87.1050,0.0000)) (idx=76,u=U+0069,origin=(97.1100,0.0000)) (idx=80,u=U+006D,origin=(101.2800,0.0000)) (idx=72,u=U+0065,origin=(113.7750,0.0000)) (idx=86,u=U+0073,origin=(120.4350,0.0000)) (idx=3,u=U+0020,origin=(126.2700,0.0000)) (idx=49,u=U+004E,origin=(130.0200,0.0000)) (idx=72,u=U+0065,origin=(140.8500,0.0000)) (idx=90,u=U+0077,origin=(147.5100,0.0000)) (idx=3,u=U+0020,origin=(158.3400,0.0000)) (idx=53,u=U+0052,origin=(162.0900,0.0000)) (idx=82,u=U+006F,origin=(172.9200,0.0000)) (idx=80,u=U+006D,origin=(180.4200,0.0000)) (idx=68,u=U+0061,origin=(192.9150,0.0000)) (idx=81,u=U+006E,origin=(200.4150,0.0000)) (idx=3,u=U+0020,origin=(208.7550,0.0000)) (idx=37,u=U+0042,origin=(212.5050,0.0000)) (idx=82,u=U+006F,origin=(222.5100,0.0000)) (idx=79,u=U+006C,origin=(230.0100,0.0000)) (idx=71,u=U+0064,origin=(234.1800,0.0000)) (idx=17,u=U+002E,origin=(242.5200,0.0000))] +DrawDeviceText font="Cousine" size=20.0000 color=0xff000000 matrix=[1.0000,-1.5000,2.0000,-0.5000,200.0000,592.0000] glyphs=[(idx=38,u=U+0043,origin=(0.0000,0.0000)) (idx=68,u=U+0061,origin=(12.0000,0.0000)) (idx=81,u=U+006E,origin=(24.0000,0.0000)) (idx=3,u=U+0020,origin=(36.0000,0.0000)) (idx=92,u=U+0079,origin=(48.0000,0.0000)) (idx=82,u=U+006F,origin=(60.0000,0.0000)) (idx=88,u=U+0075,origin=(72.0000,0.0000)) (idx=3,u=U+0020,origin=(84.0000,0.0000)) (idx=85,u=U+0072,origin=(96.0000,0.0000)) (idx=72,u=U+0065,origin=(108.0000,0.0000)) (idx=68,u=U+0061,origin=(120.0000,0.0000)) (idx=71,u=U+0064,origin=(132.0000,0.0000)) (idx=3,u=U+0020,origin=(144.0000,0.0000)) (idx=80,u=U+006D,origin=(156.0000,0.0000)) (idx=72,u=U+0065,origin=(168.0000,0.0000)) (idx=34,u=U+003F,origin=(180.0000,0.0000)) (idx=3,u=U+0020,origin=(192.0000,0.0000)) (idx=31,u=U+003C,origin=(204.0000,0.0000)) (idx=29,u=U+003A,origin=(216.0000,0.0000)) (idx=12,u=U+0029,origin=(228.0000,0.0000)) (idx=33,u=U+003E,origin=(240.0000,0.0000))] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_agg.png b/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_agg.png deleted file mode 100644 index 423319384f0e07c4d1a593b9190fa053aa38c847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8248 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 yx#X7~zf6cZ0sYeh`MK;;S+Z~g--)5dWC diff --git a/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_agg_mac.png b/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_agg_mac.png deleted file mode 100644 index a44be348b5c032c4b244a61553ca9983de3035a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7514 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 khyVKj?kDMO8y_;(D04Ia+@&Et; diff --git a/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_skia_linux.png b/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_skia_linux.png deleted file mode 100644 index a696b87a0fe9ad2b7dbb116a4123436ac55b3d91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7173 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 diff --git a/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_skia_mac.png b/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_skia_mac.png deleted file mode 100644 index dc607077e5e23fdcc7b3e183c9de1f44cde19297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6979 zcmcI}c{r4B-?uiElr4LbF+(zh2}uZJ86!%TBug11do?K8k}M-jGct@dzlIXBj3Ijp z4JK+L4KgZY$uf~`EaSQSx}T@}xsT&{-s3&)_x7JhU4GYg z`FcwmI5k61*xe{zy;V?Ny^usQjpog&ON!H~r&Njl$fun5nVB7yYN002`sw{7s~>*u zw|7Lz#1{#l+IGI!_YCW_8k5;}NTSzyFvqiKWG$$zq~Lqzc!;hKx&ocVzb8XtyP#w| z{}GMKQ#DP@G?n|-wD z_IcJ|US(Z`&w7ji3#Nsm-lI@cujT|@QL^nnvY#ZT%`%Umq)k!3N9HS;;TswTX!ziw z7Md@rf{)&H^O5jjoYlsxnC)$wdIq#7bh&6s{0{!0OBhSQpwOTidpn{BRXm#InA+=> zlHlMWwrsBZPX7Z-k!w^|^~96do8j_4FVnF2P+kkw`qL3jN2kxj#4l@WPUWTv2QtzE zI5{f5%ITXETQ94^-j>5H>V+*_L@ip({t!-i_gK?>jjo)l70rq6pnj`}iW4xCtxsVN zC_*oa;0YuUvh>c)eUTO$^4Pt_!kc=Pp8g;ga}@0Dt@I+QzbeJOVgk=`dFh{e|{tImZ5yyn+3KZ~w5Jf;6tfAxWAr_Qyve8v&;wLb6aMQw7@0uZGG zGD%|XGtc)QZ147{{^?ZIF%7qjXnWGVJ~31v$0mz5HFr#xK9qHNpL1D^JDxWHKV3t$ zb#c*m@-B~61i@g+?}uXJukMFw!t|oQ#@hxgiK}oCKc>^AO3ru~vkg=#?+1px4i9@? zo6cGc3HY2}a{;&iZ0bN~4awfoHt(}XxMyDgnk&7o;lOCXToC zarg=AsS*oZp-s$Yufn%lld&0QbL0%$#NI2Q=ri}lxjVeffRd%E4x`m{6WhV#nnS6{ z2Gz$iB^WE=H2d?Vfyg^Earw5W;Exw(eVlBH>zZv&&WWd89JO3+j#6YXHH+<9my}R; zoi!VH3Zh>{|0br%qSS&DY$>$?%ZeXwu3u;4O3ziyNTvA3F|LM$(}f;*yEpf~2T=^< zD;L5oFI4^Y*I&0vNy~H`;|9WsUVNwEO;eznMpI0|{Hb@Jl)V@6c1p|x$Y7JY2+z8! zUu{uO+vV4cv*N`?9D6#r1_v3sbWPVamA^70it>$5`K28z&kZok6=Gag(In%hN*|9;lIgZ&FHXKa!;klg!Jtz-R!)0&l@0U#GkR6*yOJZ?ky zJT}dzPi68_bFZ4z2mA`3=*8S)c|r_>(VD@4oRBwK${GZ$Z;3fz5t>xN5^oXAXJ3jr zn^8t@EI5`Y$Uw9B3HmCP2Ibh>`Z$%Jq=|Qpa!R%$sf5GG!rlydjvX3prWcbL9`Y7L zk}1-}8!6Y%3|n>-leG&zegJx7 zm`clZymh-6;y`rlhLVRy*Z7@g5ETcUj<&@HhuVDDaFUz6-Lx=i<7Mb+o6w(tBVe9nT-d2{~_$ z_r~%Y){a2RNI_9l!H0#m?ovlIc7E4I>aA zv{NXgjqA=fr=JHI^8_P0Bi-!5h?;o*S-7E2yXISR%i}&r1x4aNpsR^aZok6 zG0_QuN_A|orLU$(z_7l;(z(iBSwfQAVQR>E??kF#_I`{jz2EKcJ>@G47Q9LCsEeG| z3-Y>46}&s;x=A@BNxmg4nQf6BqD#V#2}>TDmCv%*bIBO}0?~MRtmH;P+0)NmJ{m7S zG+k{df8Vf3F*`o=GO*I$(HwL8tAJuRfwZHGGcwUQt?8!+=iObln9^-7N^tt3NAD))wq@hF3l;)0>G|#N~VpbB?(Gy|CNGRl1ij1I~)vTuag=y3|4zq&tPkS8n(j z=aeRg=r}%6$%e!P%+Ct@Lrx` zyb!CE|9?OXJcr()+R5W`s?SkYsjo8tM2q^ghU0X&}ggJ*!Ed zMPa(fI@l+G)Dft@gCCaCAY*b#Xh7W)zSV81qy1TsVIvd9M`tIpZVKS3E~3r5R3pbO=p^U^T6XQ)|4Ftxd+(qb>bmdG9V|s( zlfnv#9@O<|6#SIuetfWggPlTAE_KAVXA0k0VgPMKYf0heMc};YvnCL`g#o?}wuTdg zQvpD@zcAo0bP916HkrkaxN=xihj@_aa~jX14%|P*3tl% zPl0YS=-@)5Rkv3FlUsxjfo?nAI+%bFIdI+@oXih3atph^+nlZ0Xb8kVBML$H2OJi5 zI7=`?Hrzu>zEb>Ww@pRg;<7BE)4&(byUd1)I)#(oP6ty+jJ-ex-69mdDj}l@V6R3Y z$;)*c-MGWBsTZ!qtYNQqEdPt3{<6g6=J}KjUwG`u_N=)NlU#?177+%fLQc7y!W3w_ znvzS+{jS^PpsofAO=d$~`(DLQ>*#Fo?Kb^iPV_rT%UJ=y7Qwp|Y&n2L?a@#}U>MFI z>ML-_EiC^wUWLYcx=2uHQxvC+?K}Pjl3g2l|5ZHH+)T_wAp+rWc1`)T6kP1Sz20mU zz&hb+nfZuHN$p9&$g^}IQ1pe4t}h{?il#K$w_W(iN1g6=iaDAU2LkQ-> zL0hvQ*(wN@ncn0*2m$fj^Bh3-SIE3}VB5Ze=PUgoCrnY@ZT%LoNSKqV=+J)TeCF1> zy>An$+-R}(7WpsQ@J4?8e7M^1!^${|Zvw$A3vVy{iRM&8IgO{nEd078epIs!1DMa< z2$k&DbEqNyGNrwraY2}fi3V~AsbdX%P<+5!l#GDf4N==BaU}CaQPX?Wd%p%N_6g8v zTa|!Sa}w2^)WS5S$P0pf5hYU`=!(q zV(x%>D^i6fvo*~JI6v(r6|t zT2G8nszGql(65eLgx$VXHgthRK(z%mkVzesLT)&nnxZH~^ugBRnOD%t;DF^42d=bS zJd`I3>_;itDhO(Te|uFB&-H`CF8oj{sYzW6|`6wQGMj9e|K>Yw*EF;bXZy~EL2#m(c zM`cmKV`?fGu*onNk2_N7#xFxmUF~Dt;fFm9LB=Q<-*i!-QgyW36n#zQAwy*#=Nw<~`$uH@CrdjdF} zTi$(DSmp=Hq!~5YyC;#l{ZZXLYhT558HLKbfuZV%u1gYoLHn%2 z;jn zP2Rbz4%85gH@o%Kyt4JuR-)SLZ)uePfZhAFJ~kD}7&zkw7i)m8;WCdm&7zM0{#w2z z21#+fojq)fGMpID!K_m@5$(~`>?!WleR+wb#638jPtC(w?=QxGf#7t4d#%IYx^=A9 zSwo6q)qw-f2ZmX6~buvb?p$Ja&x{f9=7qcNo8(4sWYm#^lJ$I zB#c1KmQs4SUbs+-Jdaoef>VbAr^od6ls*7Y9*H(WS%s@kI>BJ|l|gl2R+T!SgzZys z-_S|d3qpv)tw+C-ufxS&b!#B4!tVk2HNqmvzv7mzXXgQoJ1ui*`sf ztBJwI;`bF4r98+Rl>lN}?#2lYm+lmj)^eos2tT_U2R3OMO-BGX4O^!wI`^Dv4=D#G z$#xy-SG!bUTTc@-RL@wVqM8N_a@SwuAmT@X;8zbm8dS>7zUFTgcq!t_hir~V=(T&) zY{`vVFLLiO9fgT7Pj_o%;@_h$td3L>*?_+%$_6nIuSq*HH_PDg=J;5whR}`wsNJXSnA<+J)r(j68<^2IwpLt7#pZ zDvbR<%>FJ*5} zJrS1!0cv!cJ_({ymP zT0<|HG}?<#4MKR*_OWd0kW}$Qt--!b?R8o$YU>8dC7ay5@C;~*j-tlXril4^-W2t5 zpst?zgt^$AP#1(Rgt35$qLn|z8^k7yf|D2xG=6q$B zqjqi0-A~j(7}X~GOimW#X3>cMMSOp27@+tYGHI8)R+SB3kP6|Tw|gCyHuLKu)>b&O zT-m_}nM&e>EyDn%j;4?HJOr015XcT;2vOtj z`!eP64X#8l5T-!e%%*Q;hMfRW>Qs_|kIiaE;z$LPPW{d1E+>98UKt}&vl$>n5E?De z6l$Qoh?_G-6RAU!7F_PLFvhz1SYW00S_TS)*??<(rRNmuW?TizTz6}$QJ$XLJuIz4 zo6PqhVnIH=NnT@F>SKD`v5k4&3rJMUgzh?vDWG*TFz+9&)c=P)%zy0({NFZF|Bd$P zzYG0u_iz6@fsA`Nil%dG&`Hm4GwK`bPq|+kKMH^& zuZ?vq^d(xF4WiHls!N6%S-K64uKpG}cv6v~HFp~|X&^2w;kwo;Lu@Y6<&0-8_8Kg- z&g@Lp>;u)a7~);%;)OW#6<0LcUSx6j<)Yh_YY&Jr`&CXgS4?P%I@cgW62ejwOEgC9 zvif2*OIaA^HlG@7eED516XjAZRO8#wWpm^7(OzCNSHoGv*P%wmWxy7qcV z+c}eGKYx=XoQozF5FowY=xXJj%)Tqk5PKbVcTVSJ82R~Sa-*EIRD%SZ-`&Qt2 zxDl$zqlmf$r{nzgJ0ol(f%qvHi{iA22Sr}1o;~!THm-Jy9+8@yWEO0416D7y2zuK% z?~~i_gD$qMy^+jNYzw9>ucy4D#a6xgXhWvV8!-npd#12ICWLxEYIVVb2WZe*Xg(5+ z?mx}GPwS@gTCm>wXATfwpw(#3+h9I-O94pb(~xUovSgeb4Aylj^L>ua zUCkj+v>00pCM{{f&EHJa3$bQ&*(`gawR+PBoV%@uJzZZ5%Qu?E&V2j^gk&d9PuuPn z*?++d-OLJqcUp+(lq3>CWQ0Fk(*Fqmr=Ldu`sd~!MW<(BQ`0EnVy)5HoUOlO2oo## J3nRCC{{aeH>nH#K diff --git a/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_skia_mac_x86.png b/testing/resources/embedder_tests/bottom_text_added_bold_and_stretched_text_skia_mac_x86.png deleted file mode 100644 index a7ce02d07744a641d0384506f6d38d701e457aa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6979 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 Q{#iXlnOGZ_pK*!#53EsHh5!Hn diff --git a/testing/resources/embedder_tests/bottom_text_added_bold_text.dump.txt b/testing/resources/embedder_tests/bottom_text_added_bold_text.dump.txt new file mode 100644 index 0000000000..67e0ddd472 --- /dev/null +++ b/testing/resources/embedder_tests/bottom_text_added_bold_text.dump.txt @@ -0,0 +1,8 @@ +SaveState +SetBaseClip [0,0,612,792] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,792.0000) line(0.0000,0.0000) line(612.0000,0.0000) line(612.0000,792.0000) line(0.0000,792.0000,close)] +SaveState +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,20.0000,772.0000] glyphs=[(idx=44,u=U+0049,origin=(0.0000,0.0000)) (idx=10,u=U+0027,origin=(3.3360,0.0000)) (idx=80,u=U+006D,origin=(5.6280,0.0000)) (idx=3,u=U+0020,origin=(15.6240,0.0000)) (idx=68,u=U+0061,origin=(18.9600,0.0000)) (idx=87,u=U+0074,origin=(25.6320,0.0000)) (idx=3,u=U+0020,origin=(28.9680,0.0000)) (idx=87,u=U+0074,origin=(32.3040,0.0000)) (idx=75,u=U+0068,origin=(35.6400,0.0000)) (idx=72,u=U+0065,origin=(42.3120,0.0000)) (idx=3,u=U+0020,origin=(48.9840,0.0000)) (idx=69,u=U+0062,origin=(52.3200,0.0000)) (idx=82,u=U+006F,origin=(58.9920,0.0000)) (idx=87,u=U+0074,origin=(65.6640,0.0000)) (idx=87,u=U+0074,origin=(69.0000,0.0000)) (idx=82,u=U+006F,origin=(72.3360,0.0000)) (idx=80,u=U+006D,origin=(79.0080,0.0000)) (idx=3,u=U+0020,origin=(89.0040,0.0000)) (idx=82,u=U+006F,origin=(92.3400,0.0000)) (idx=73,u=U+0066,origin=(99.0120,0.0000)) (idx=3,u=U+0020,origin=(102.3480,0.0000)) (idx=87,u=U+0074,origin=(105.6840,0.0000)) (idx=75,u=U+0068,origin=(109.0200,0.0000)) (idx=72,u=U+0065,origin=(115.6920,0.0000)) (idx=3,u=U+0020,origin=(122.3640,0.0000)) (idx=83,u=U+0070,origin=(125.7000,0.0000)) (idx=68,u=U+0061,origin=(132.3720,0.0000)) (idx=74,u=U+0067,origin=(139.0440,0.0000)) (idx=72,u=U+0065,origin=(145.7160,0.0000))] +DrawDeviceText font="Tinos" size=15.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,192.0000] glyphs=[(idx=43,u=U+0048,origin=(0.0000,0.0000)) (idx=76,u=U+0069,origin=(11.6700,0.0000)) (idx=15,u=U+002C,origin=(15.8400,0.0000)) (idx=3,u=U+0020,origin=(19.5900,0.0000)) (idx=44,u=U+0049,origin=(23.3400,0.0000)) (idx=10,u=U+0027,origin=(29.1750,0.0000)) (idx=80,u=U+006D,origin=(33.3450,0.0000)) (idx=3,u=U+0020,origin=(45.8400,0.0000)) (idx=37,u=U+0042,origin=(49.5900,0.0000)) (idx=82,u=U+006F,origin=(59.5950,0.0000)) (idx=79,u=U+006C,origin=(67.0950,0.0000)) (idx=71,u=U+0064,origin=(71.2650,0.0000)) (idx=17,u=U+002E,origin=(79.6050,0.0000)) (idx=3,u=U+0020,origin=(83.3550,0.0000)) (idx=55,u=U+0054,origin=(87.1050,0.0000)) (idx=76,u=U+0069,origin=(97.1100,0.0000)) (idx=80,u=U+006D,origin=(101.2800,0.0000)) (idx=72,u=U+0065,origin=(113.7750,0.0000)) (idx=86,u=U+0073,origin=(120.4350,0.0000)) (idx=3,u=U+0020,origin=(126.2700,0.0000)) (idx=49,u=U+004E,origin=(130.0200,0.0000)) (idx=72,u=U+0065,origin=(140.8500,0.0000)) (idx=90,u=U+0077,origin=(147.5100,0.0000)) (idx=3,u=U+0020,origin=(158.3400,0.0000)) (idx=53,u=U+0052,origin=(162.0900,0.0000)) (idx=82,u=U+006F,origin=(172.9200,0.0000)) (idx=80,u=U+006D,origin=(180.4200,0.0000)) (idx=68,u=U+0061,origin=(192.9150,0.0000)) (idx=81,u=U+006E,origin=(200.4150,0.0000)) (idx=3,u=U+0020,origin=(208.7550,0.0000)) (idx=37,u=U+0042,origin=(212.5050,0.0000)) (idx=82,u=U+006F,origin=(222.5100,0.0000)) (idx=79,u=U+006C,origin=(230.0100,0.0000)) (idx=71,u=U+0064,origin=(234.1800,0.0000)) (idx=17,u=U+002E,origin=(242.5200,0.0000))] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/bottom_text_added_bold_text_agg.png b/testing/resources/embedder_tests/bottom_text_added_bold_text_agg.png deleted file mode 100644 index 773671d03c2f85e5049e133a5629e8dcebe7ecab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3940 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 diff --git a/testing/resources/embedder_tests/bottom_text_added_bold_text_skia_linux.png b/testing/resources/embedder_tests/bottom_text_added_bold_text_skia_linux.png deleted file mode 100644 index 015a80908dc38f5b53dfd5323b867b78730ededb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3447 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 diff --git a/testing/resources/embedder_tests/bottom_text_added_bold_text_skia_mac.png b/testing/resources/embedder_tests/bottom_text_added_bold_text_skia_mac.png deleted file mode 100644 index 7fd1057c33766a83cff159faad57aa09c6a675f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3580 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 diff --git a/testing/resources/embedder_tests/bottom_text_added_bold_text_skia_win.png b/testing/resources/embedder_tests/bottom_text_added_bold_text_skia_win.png deleted file mode 100644 index 1352d27967ca57b4ca41a3cbd0a02b035fc7642e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2602 zcmeHJeNfV894EVKR#s5wMZS=5WV=KHW{V7L8^Vg6g|4Qexhv2XzLZ8unABbp2jWqR zp{Cm$*SbTk9|qYZx3c&ND07u>_)=4_Li7}0V)!z(%iHa)_HzBR-Tr#+`F@_ybI<4Q z`F=j%>^)&LkEQFDLLd;2o$ph^ArLnf1hR1L8#4vS4*R#s5QzKGPRctUrnlSMv`2et zJWoHmx7x5{WxxWT@7&({%I&AqscRm3FWQ=5oai{6R~|dq-W9A0=^5m~a@{?|(6}>e zeB5iJ(wD7*BNs~j@RY^K_gL%kl(XOtmT;JNxNEL=VV&(&w)e-G`2 zhUeN|XqeMBFMUqiy!1J3ub}Z;9AjP^I!i9M`z#rw z-yba^q#qAPS~Y1SY>dfS)oi&=9wQ^;$9O9m(9!YnYA!$Ok?&Bkv#LU2kLvkZW@#>X zEN{6+)gruVt0+^EEP6SYgx&14s!D^R_kW{Jc7t+a^gpd886cB4wQz} zo}UZ=N=SzrTflfLI=TX1xRFNU53Y^4HM`|FD5xLi^8H&L8ZQ_rJ|PPnf@FvoHB2f9B4wndb1E z$;J8n`^y>enqM({-76Al7M?mN&9BZ!tVj$Z5X{D=o28$)2Dp~akeGwsmF6#1>j9cW zsLWi`rbHy2(-|&-Q@5q;`lem?;Y|dBidLr%%`+xK4_3jhT0EhS3zuml#-oB*V&+}2 zyhPC{}3#HYec{4j{+W_{l&PW)@qVd*RmW9fQ2Mpn9GE|PSEA_tXnGnM?;8TOG zLK!oWnMm9vDP;EIZY1G=JEt7mBo}MNg-o$GnpU4U2|6$EtN}!niYytvhUCac6si+ z4w`~0g6j6#TQ9Xg#t;nKkws_%vwK(kV4t$@>f6!>!k*}2Ejt;_r_@arv@mWav&yD2 z{Q27Rf&_nCX=^=xP}%_884rfXk$^6|!3+Xom$o^0oRurpYW;(eUVTBMnY*{p<3&0? z&{bT4&8!v+;am}DOl&fNYS)9|Av4?RDMed{Ivr-Paj=ZWV%EW<)UMGh8kjT+Ma|Ai zDX5UeZ31ea7Wr_3Yu(oa-JVg@&jqKl=Z7mle9D5~4`a`5S}gcs8gjO0YM-_q%b6Vl OcZP;hD&GD0)87C9+atvQ diff --git a/testing/resources/embedder_tests/bottom_text_agg.png b/testing/resources/embedder_tests/bottom_text_agg.png deleted file mode 100644 index 62ca5c01ad2ed8f4b9b96eff1df5e5cdd636b64a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2541 zcmeAS@N?(olHy`uVBq!ia0y~yU`kp0m|GK6`YP#y}O;?UTZjZBn|NXVy z^gFi2@pji)e(3K$7Tj<`K(d2pqN0(2q!Kfba$!?)PU+xrX*=Nnq$V~3rNQDr$~i^B z2r3SwhK@G4AHaTt`vL4XnAgF6gL@t9w?VIM=5hu|ybVRigAyGvAv{deq@s~OCrAEJI;SlmGrJN!wj9|8j4s{+{~}Zf)!2cAvlN!+V>&vj3CHkNwN8|FmcNLvM-5 zT}%EQzBGCMbhq5v8siTKj@O>772ZB;(sQ+QuFmlvcG%vJp5B)ibv3-Giwx2)TzByrC?8e8RB2suw zUtdOYs_x3${`L1Bu!@2HpFV;tY4KtHFvo^N!=dD@iG`6lfGVj@@ zWyi18i5yyJYPxo(dw%B4eV?vAEO>bI6>qvzMs)D)eeW+V-|aK+MB6OCsb}x+%7`kx z+avyHsVr;h?B()*PWO8Axlhdf^{j32=I4Lv-fsD3{Pb$|`-%dUzBjMC%kP#RfADUm z{(hs+S2Nxvn3Sw~_3hX3^rf@*Z(WmjY|hu$%Sw;PAKkgNPki~hzP?M{X>ar9RlQ#~ zUuVaj{SV5cxxOEN-=w|%|IuqNXSYocxn^%r{@})!_=4Gy6;=MaHGQ1 z*nL`YRv#TDR@UTY-23+9frn>#{L5()2m;HOqR-(`PL&Z#{N%xwu<-%zh2=n{UIN z-txQgEp<-6c=7CKz1H5N>Bq`v#!S3>N8n$`#mTihtm0n%C@g##USAxVa#9Q6Lyt^c8#RyD`t;`AlT?oe-;(6As0^9D+>0h(eK-7qP{w#sWy0`O{tqWg2`}gl(_s$cmHa+A&*(aIb za_-PJb+Ob#^Je??y*H{vaw;J=Uts&9?5?A*yV4_iBH)-Ph^QdQ~rIsYpHVL_jz}Yr`~jUw(zKKtNNz% zewIPu|GrQB-CYF?qCFE+ugCsgT)nC*dfMF$npRfPb8;lQ-<)!0oqE4g@88uM7R3i+ zudhE}ruzKeq&KHriZ2GdJ}3QNC(6!5ag)KeY5i;JPMtrlwPbln_28To%Hi@&d*ALA|i z(n|WTtnIv0F8dW1@2tr95b-|Uuk>rww=X}AZt+=VTz=`zs;T0)*cS(vd~5rB{5QY6 z?f2ui^?KeLbt?b9->G!Eu4;-_+^^S*()ao){XTD1@Zi^&sNMuG=k7t0?#x- et)hQZ>lvE)Uj=LkxpD^7j`MW&b6Mw<&;$VEa0^cW diff --git a/testing/resources/embedder_tests/bottom_text_agg_mac.png b/testing/resources/embedder_tests/bottom_text_agg_mac.png deleted file mode 100644 index 32ec42a9895b66d23a0add8b1b4eb5bfc4462c25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2549 zcmds(X;9L67{_UyS-afKjxAkl)2y~sN=s7|N-*-sHdj$2@WLepRJ_A0w-PXmaZOn- zn(|JCiPCTpuyWBdZPhLNYe-^}Ck|+M7(qM-Qal zdc*Y~5J=DEG{O@E`U(dE>FijmHGocxmxOC&O|&P{3B+#yZWshw$8kZN^h)R%2a<{2 zgT{?YWERuY6&+dkeQgjiePhVTZ-3a`FpzL9+;YwKTIL`%S+!{$_^!0F@ zM{sV4=7`Hx+7)lvh607b)}?pOh1Tr=-FVFJr*zb3AIxD>ks;NldFx!IC>$LUKc zj-iTKIZIe_d6S>Y;Cm~?*CucrZ6hMR<%CwU(pvO)n&@QhvC;}0r*;2h*NXm5t$W43 z>|Q-#pBYxzJ~6DYeMVnl`;5NA_MZ=vn=KFQ(_mIv@ynh6k`Dh*carwP?eeO9P+$C6 ztoofyI*{d9H`(-ok6MiP7e$b!8y~Zfm}?9iE*9hXRDC-vc(G2_rP5qf*oT%Y-`5j| zq%%|7N*&syrz&52&zwGmnw(#(1kYcvgdS8C1EOb)o0$nPMzsUaK_Ad9p1lA)%0siE ziJFq6p2^w%=U{nO&e=sl4u*Bd80fc_$#&Nk)<&I_#5y|rL>CkYx4?FE@XQmfOlye* z#XQv8aVhEgLR~ zFzi!C^}=VLgU@T`p3vHK%N7;_)VN?uv8bLj&{aMG@p{mZsLnLu9!+f3Yg=?fvnYy& z_9ROq`>1}VzW_$k{PcTlB6@tF>TK&o<6v4XW;k!`20K+*EhwG(XdBMAL3tb`g$ee< zx)vUW4ctP@?%6?@tldVP9IQQG7{=VQ&2LiBkrO8_j2JxBOj#0!jyRG7$^4{aA&*+e zezkR|XIGZv&-7prYR`r|EPw1ZtrwQ_G6W9k+-2k{*b` zRX5G&AE!R)nfQkAyrB?jQw^hZZK#<>E~pA!aRr^dn|;9MH|V@^@mP)WnKl_}8!$xk zJoE6?&-?TJ5OK*(Pc6vZC2ky74!FTmrcA$wNk`#EGg`K9&BF9;R?@Rg3E27UXx-G? z?vS9wxmL4ygt?Gs07yH_XwO$^~}STT?wa;37k1 zz;e~LT(#MK*;G64ecu76;Yx%$=)4g@n7?E=<9_~iDn3{`-qlATP>@ijo-qj%nUH+2 zNZ&7{#sH95Gmv!`U8nCyzpR$eAXMM#@K46y>X z3&>y`OCH1*`&jH`EnP(kFUE9VHRsYXUH^f$x_;v+(PFs-*Ya`9tgHmz%PFT@URp; diff --git a/testing/resources/embedder_tests/bottom_text_skia_linux.png b/testing/resources/embedder_tests/bottom_text_skia_linux.png deleted file mode 100644 index cc9d46c40cb640c3f9ea871b7f114e19ea46661c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2325 zcmeAS@N?(olHy`uVBq!ia0y~yU`kPusO79<1+SKI-kW!?*sxFhjlSWt=ghZn{EM~zctSuDNGTctrNQDL=?)&CG*}!YJ#@6e`~dMA z%nx9{!MzUl8{F$)zYThAqmc(qx1*6aNHgr9&qAR5kJphO?R(Z7-@beIyz<8nTE3iq zBk%O}%I0ldQs-w$mmTDvH}kt=+PZ!1s|#kjUAyyqkM!2Zm-Q$A)82IDj;Z*c2YROJ z#>GmzbCiEqC#JdG+CX$wah(v|-}uRW}5_3y}C`*QnZ_$I5Z+cf^&U3k*? zP=~7fYH#P-MS1T}OqvsWD?FvV)ga0BMsP*d*S{NgPIUE;4V}u{`NBK@#Icf;i@dov zUZq|<@bJb#pOpQ_{96iM&-!&J_~A`=rx)8*rB1JV>T>O8%8hH7EkG?=zEmY{=Q!J-@InpQo6WlSpO~5++n-fi71HsHujEE~&4Z?G{_FBAl{W>?+?tbe zF~)4u`Mf_%ORpU|V|?>i^W^zIHvZ^8HgjX!twp)N^R$5>@z?E|jgJ1#r@u0N%}cyx z&%TYB+MAPZbgw-1SG`c^-CcV{@6P_Ee(aA}P;oMsdA_{d{>)knea__=T3ra4_)*ha-=+dh$U_5%KOuw?|r6s%jHB+Q{h-E+Q5 z9{BiNzG8jxtjluGCLER%6BBb%VDaKpZBY$z;qmBRl+YcNbL-NqbrHh1ueOCGJ7ioG z)%DzH*xoXMt2b)f>{$<%MN9i+WNkXR%_H2m?7FYn%;oQYpPO;UtZB;?xnt*_Z#eV& zx9w-XGc_|S)6InTB|Ox0Na^5lX*(ex*}*fh5lAU9PgFE=VN-HWQ7{6EgQUUYKuXaF zC=C_|Ne>-ua6f?k2J-{NZ!oWe{Ra0s*l&Yg+nL}7NW2Y2$Ac0bF(Eum)1<)6+ud)XYFzP;8F=|3ub=1A?_ zZTsVIeNB0+T>tccmvpMiUd}(UYW2FXX9pht^jj0+&Fy{pe&lTZHEX|1yBF6iIPbYT^*)*TH!h#}lN_V*{M@leD=YNZhp#;Mlv#R{?0)^{yRzT@2rgYzl&7Wl zMB26QuBExTS;Sh~z<+nIpLyz^7T0++_UYj_Z|^SMuk<_W*@b;J!q-nVuU>qXxB2ki ziBrR4A1^+>C~(#aWo==pn}1&%JH!7tMSauaLfhgEe;m%-`Ib<*{{GbByIb#_c-8&? z>(!apu1u^o{rvTWyvg--{o3|-rc~~DadYW^rQ7#=-(0i_vDY~Zht&>^}T8Msh!^+UrO3o z{B*0uW}ul-=9`MvN#8U+yZNo`?pG(0vR9Bj zJN@*`RO!mxopvvNnkN2x#vc(bzG}br)$+4d>!f}?@4bEg%I<5n@pE4~eSiFE-8oC~ zTQ~Q8ySQ-m&o3G0_5RA-{O>DyQ@4BVS$@&|AFVpy)Mpo6wKsmw?^p96RS48h!O{=` eS0x9Z{}N9S*n328PhUK!h2`n$=d#Wzp$P!r9o_l> diff --git a/testing/resources/embedder_tests/bottom_text_skia_win.png b/testing/resources/embedder_tests/bottom_text_skia_win.png deleted file mode 100644 index b84d61ae1abfb47992dd47379bf22cf91bbf4ba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1478 zcmeAS@N?(olHy`uVBq!ia0y~yU`kJ<;$;Lz54(EKWF9%3kC+(G*1`DkcwMxuiNHd4v=WL=zY~hj(O^VWbsu! zQyDaqUD=Jc@pkkq@iyKSJ8R?5FTXeM^t|Pi;H1#@%Vv^l{OP#9ckOeW>LZ*QcqENd zPPAZ<6F5QQSV%=-kT@37Sq&tPg>3TyiKCD_GeII)NJ%4*I5slH2_%k%q`%`OnTYo( z#P3*q3JC#hK81t;aXy7a9F}N;L?4!DfAJiNK+`{Tulcdn^!$_*FX9Dj1%q8opA z%$;vKJ12(E>iA0e!ddTvB-PhCE{|Q_>{GT&{`t?Fr)##pI$W|}JaG9n6W-Tfo*D2y zUnyO9EpvU4c714G8?R#b=aZ{LB}+HHh+TL5`Q-A;iBnHjU5%}djJxJ4cW>)6*Lh_> z^CqR=OuZX5P5h&s_4Db+7l#_&=9}$g*0KF-)kodk(wiK4@;?3Q`Tg;YxB0D^Yr1Y; zFS>Yo{j=Q<+t#c(&HuXekD;63)kWKH@y&KF+oNXf<)3mtNb1?%oPRsT*Bjr|csBo( ztNs32?|=2DxW9Cbn^CygBlBXlgjsja&A*k?a<~1z8+q-2?zE$`azbp+ZOV{}jH~cZ zxtw@!d)fC*x;HP!O*^T#>3WsE^wE=L`qtTZ4*9TGhYEiF>obl2*l}UwRf~$}^1af% z`Ag$$N~rbZv!8#?@;{R_O|R>0XQWxn8~xko)>w(%%{X)Dk9x|)d4Kh1)cat|(Erl! aGhVBouX84P(?4K=%;4$j=d#Wzp$P!-Pe?HU diff --git a/testing/resources/embedder_tests/bug_410996566.dump.txt b/testing/resources/embedder_tests/bug_410996566.dump.txt new file mode 100644 index 0000000000..e06cf305ce --- /dev/null +++ b/testing/resources/embedder_tests/bug_410996566.dump.txt @@ -0,0 +1,7 @@ +SaveState +SetBaseClip [0,0,200,200] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,200.0000) line(0.0000,0.0000) line(200.0000,0.0000) line(200.0000,200.0000) line(0.0000,200.0000,close)] +SaveState +DrawDeviceText font="Tinos" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,20.0000,150.0000] glyphs=[(idx=43,u=U+0048,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(9.8640,0.0000)) (idx=79,u=U+006C,origin=(15.1920,0.0000)) (idx=79,u=U+006C,origin=(20.9280,0.0000)) (idx=82,u=U+006F,origin=(24.2640,0.0000)) (idx=15,u=U+002C,origin=(28.4640,0.0000)) (idx=3,u=U+0020,origin=(31.4640,0.0000)) (idx=90,u=U+0077,origin=(34.4640,0.0000)) (idx=82,u=U+006F,origin=(43.1280,0.0000)) (idx=85,u=U+0072,origin=(49.1280,0.0000)) (idx=79,u=U+006C,origin=(53.1240,0.0000)) (idx=71,u=U+0064,origin=(56.4600,0.0000)) (idx=4,u=U+0021,origin=(68.4600,0.0000))] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/bug_410996566.png b/testing/resources/embedder_tests/bug_410996566.png deleted file mode 100644 index ec98812825fb9f724fa6bc3e8110a83236ba1ee5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCV4CIW;uunK>+QAs-oc47#|!_@ zQ0SQ8(X?xVVM_Mec!@Uqt`*$^Qx(!SI7DyhSzzGN!&P!ht6g*{_aW)?O?p{>4{)($ zN2%q`Iks)l<&15%HgDgoF<#%ZE2F(?{_4*)=i3i|KU#V2vyJH|`JGt}42(=H90Cds zbZ4BH@4)51>~c_Dn4Io^E7kk{XCpa`p62vD%gcE=$GnZZ%+;&#_RN^CzDuW^DU%mJ zX7Q#cTsA1GvLe*>+XY&1;U4;#W>?$9*xM`09-nm5LU*YkplhNB)1* zn_876FPFam?mqRO`Oz!Z`_I4Cb)F*o@|APctYc1xUpEJR`I7aUN$ttOZ$}m>FH#Tc z+ntmU!((gWWjuRb%$!oqm29T22^+idamU4b9;ePmWid65dbzg5cDIe09 zs`y=MlBh?LM+Ez%yS1fH&)Zcf?7vgwb5%KN@$avRzl~Q;zr~i$<5BWChILY9)QW$f zqMvs?TesfQMF0Jj%JchXtoWLqaxC6jGT-|8_UywKgPs+o+ud2>x%bK*kqGl?y36cJ zcAPhPr>P&dI9q(p7R9=%twk4gk0iAQEGSu>n&PKB{mk=6Zx>n4FRCw<{`ptg>rGnU gW-($T|IhIW^8dHU1=oAcZwIATPgg&ebxsLQ0BVLIxc~qF diff --git a/testing/resources/embedder_tests/bug_410996566_agg_mac.png b/testing/resources/embedder_tests/bug_410996566_agg_mac.png deleted file mode 100644 index f7790873708720a5ab14fd8e5f9a42ff9200af10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCV9N7!aSW-r_4b;#M@XQ|@xsp+ z54msAa{cHS;4$MVvkTXeLrUgBOx z0lG7a6i#FmM5fq&d1N1CBr6ln@oC$KQ|g?lre|&iE9Yz7tJnMSee#n_pH~_xug} m-DPxp``K7-VxzOqFhx9c8_zuTQ;*F-DbUl^&t;ucLK6Ub!wLZa diff --git a/testing/resources/embedder_tests/bug_410996566_skia.png b/testing/resources/embedder_tests/bug_410996566_skia.png deleted file mode 100644 index e8d37030861154f2b40a0e24b8f0695f10bd01c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCU~=$uaSW-r_4b;zM|7aXfsfVB z&Fi}|wEKEFj~?{0ir`v0GpD1woAd003k%DNgpPDA5xsrz>f9Hf1)BRLd z+1To({M_cT?C_c&LK7E0I~;P8ul0KGpZnUai>;OR&TC5PyFYR2h7-%#(~j;FC|>|ut@ggig4?tod3}m6z2IVEN|D-**6rqmDWB^^>=jpV;Vf^iuC?d zVb8CA+q!+~S8pZ%F9H8*7nsd^VV+%A?)`C{RBwRYTkdB)f09-_Ogy@0>&a_p=WPG~ rrnq14m~iUfP0q!aa)?>SRHEW7*wl%_mg{an^LB{Ts5KPmcY diff --git a/testing/resources/embedder_tests/bug_410996566_skia_mac.png b/testing/resources/embedder_tests/bug_410996566_skia_mac.png deleted file mode 100644 index a2b1fa711bbab70defdaf870f9aea9ab718fc449..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 658 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCV2bo~aSW-r_4eBSY!OG110R2~ zue+;tby~Pwj;P4)2~OKMs$&#Y1b8^K<}j{i*|^a_;EA3>W>O)0 z^k3xV?6uz`>HNf8U~>Jvc9|8*-3s@$TR*)N2s#}*Gwb;I{Jl5V-{)KOv&Ne9>fZL7 z)6Q+T`5z@;wCJ2p!;`L~i!Mz_KiHp;%doS6ulncJB}wZvyjd%M-D=X_OX|w6 zingf-)4soNOMH>x@$XnwfP}-Wbtk&!hg_Naxv*5G#P>w*k)IlurJPi>#cHGOB`w}) z-jMS$biJR7=)~Z+^hT_msnf9ntSqC^Oudvm&_K%e`@}A^quypk9*C^b%~9-pZ$vVjDO07_oOw+ Qd4Lj|r>mdKI;Vst0D(&Zr~m)} diff --git a/testing/resources/embedder_tests/bug_410996566_skia_win.png b/testing/resources/embedder_tests/bug_410996566_skia_win.png deleted file mode 100644 index ff47df6f7f873b20da6cb140634d48d25698f3d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5m8A!&LZC(qcqyv0HT!FN=w|8D%UUzr*k|j&_ z?Adeq^5s{rUj6_7pEL7>1p@=4il>WXNX4zUR}8Zc6$rF_6wbc9)A@g2td1nN(1{3h z_m`K>T;x~K)$I#RuCXg)SNAq=zVK+{=}D- zHRizyWfd0l)~;SY&tzj)miYX__(SZ;V$Ejv9&0aZdbjQUvFYIz+P(Zi82)*3y@t8@ XcF?w*`+47i!O7t1>gTe~DWM4fM#-HC diff --git a/testing/resources/embedder_tests/japanese_cid_font_text.dump.txt b/testing/resources/embedder_tests/japanese_cid_font_text.dump.txt new file mode 100644 index 0000000000..14fe0e4247 --- /dev/null +++ b/testing/resources/embedder_tests/japanese_cid_font_text.dump.txt @@ -0,0 +1,8 @@ +SaveState +SetBaseClip [0,0,612,792] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,792.0000) line(0.0000,0.0000) line(612.0000,0.0000) line(612.0000,792.0000) line(0.0000,792.0000,close)] +SaveState +DrawDeviceText font="Noto Sans CJK JP" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,200.0000,592.0000] glyphs=[(idx=34,u=U+0041,origin=(0.0000,0.0000)) (idx=35,u=U+0042,origin=(7.2840,0.0000)) (idx=36,u=U+0043,origin=(15.1680,0.0000)) (idx=37,u=U+0044,origin=(22.8240,0.0000)) (idx=38,u=U+0045,origin=(31.0680,0.0000)) (idx=39,u=U+0046,origin=(38.1240,0.0000)) (idx=40,u=U+0047,origin=(44.7480,0.0000)) (idx=73,u=U+0068,origin=(53.0160,0.0000)) (idx=74,u=U+0069,origin=(60.3000,0.0000)) (idx=75,u=U+006A,origin=(63.6000,0.0000)) (idx=76,u=U+006B,origin=(66.9000,0.0000)) (idx=77,u=U+006C,origin=(73.5240,0.0000)) (idx=78,u=U+006D,origin=(76.9440,0.0000)) (idx=79,u=U+006E,origin=(88.0560,0.0000)) (idx=80,u=U+006F,origin=(95.3880,0.0000)) (idx=81,u=U+0070,origin=(102.6600,0.0000)) (idx=15,u=U+002E,origin=(110.1000,0.0000))] +DrawDeviceText font="Noto Sans CJK JP" size=18.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,292.0000] glyphs=[(idx=1471,u=U+3053,origin=(0.0000,0.0000)) (idx=1535,u=U+3093,origin=(18.0000,0.0000)) (idx=1495,u=U+306B,origin=(36.0000,0.0000)) (idx=1485,u=U+3061,origin=(54.0000,0.0000)) (idx=1499,u=U+306F,origin=(72.0000,0.0000)) (idx=9861,u=U+4E16,origin=(90.0000,0.0000)) (idx=27506,u=U+754C,origin=(108.0000,0.0000)) (idx=1391,u=U+3002,origin=(126.0000,0.0000)) (idx=1471,u=U+3053,origin=(144.0000,0.0000)) (idx=1471,u=U+3053,origin=(162.0000,0.0000)) (idx=1495,u=U+306B,origin=(180.0000,0.0000)) (idx=18,u=U+0031,origin=(198.0000,0.0000)) (idx=27554,u=U+756A,origin=(207.9900,0.0000))] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/japanese_cid_font_text_agg.png b/testing/resources/embedder_tests/japanese_cid_font_text_agg.png deleted file mode 100644 index 7bdc0a9b425eb1c4fb390a35e48be8f705af8cfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4036 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 diff --git a/testing/resources/embedder_tests/loaded_text_agg_mac.png b/testing/resources/embedder_tests/loaded_text_agg_mac.png deleted file mode 100644 index 35b58c635741056d07e5054de6f0c272c8ed5029..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2663 zcmdUxdpHw%7{@11bq;X|lM$KX6qS_Y)>h4g9G4L0lJ;05_pmj$?J2nynhqkST z+-jC7l9j`Fl*`;2L(FZtZ#HLnI@KSiKhA&0U+?pL-{*ba-{<{3&-;B7?QG1YBtQ}X z06@yp0&WigY(oJ6;(LA)34qfxg@K|V7HV$}1CZNQCIJ8mbxZgeM;vpek8ryiBld!O zG`Qi8X9$}lXJki>kqppOl!F(V9i;e%rdu1xK0o714Rbj0(dm$xO!wMb z$L?x7+0oCS#~J&uBS)@(I6ePKIyDj+-M~oYD;zfP<18-mM%Shn!lA=+D-`cJ2xFzs zOib7U4iW>KqW0;**_>Y}i9%Dyse zvVCRPWc!M~$@UNWCfonNY-rn;f7^UCRGz_ty805 zzV4n{?l5G5qbR&A>_{EzGO|(@HZd^^X)QeklolI&a}eGbe{U&k6^Wi{65rW;4u+RU zY#d)z>^nB-XW`Dp&EyrICK*;QB*}dtmft-h@YR$seD(ae$oND9)}BPM#MT?{COu@ z-kN$c(ck;Z%ifG>THW?cc?L7nU7eqw0`!+?*z5eKk^d1xSI=~h)>JU3oY?kkysclm zG2M`IWWg1qFbm~ z#rNHLvi9i|ku5=S))#co50;{PV(YFvq>Uu^vdHIA0{zO-x#ty{zD$sQyipe{f%^#)i zuA-hLF7?oXsgFsr0t}~PmBeSt*fZGRQkArGMa6ON<#xDNXs999O<9Xl1|GYI4KHhO zpyN65zmc-q&tex!U_OZ;LTKRFU+1kr1sV^l9w0j(tfC%gzCI$!DqW+C8kZ;9>QT*6 z$>JMM)!sobg^e@Z9+WY#PSm)IzAViIU2HdV>e8ru^OTLP=QVR7VD0{3{wtXbta%1x zeD;>_REUA_T1xU9C4W${J1)3A&AA{NY5OjCB`Zsd5v_Z3Dhfr3t_kJAyAcsq>xi|^ zSPhey$jVG>yN`t{H}Z}am1pC9tj@!rKG)eNa(e}_t}8w+zd6PTPGvCkcXTYOcL zwzke`n!JiCFre{sQymA~vlE}R9LuzBCxtqiKGIgjzAkTk+hw0QOn5t`rkEb34h_8e z=FwG7lhs(W7xa{tT;I(*{mv!^a)_wdWC~0*84qeq@(HI8-ZEp1w_uvVoRT4^EG#mw z#*4eRsFH>enNVBeUFoM*(`2YYp5QEVyn0=Squ~G$R1es#%N9A7k}F#Oa4cD@{2it zGq7;U?@jxg{@L)hn6dqsc}pE0|KX@w0DjN>?bwRhxIx$!k%BOQ7h1@Fz922lY~W+KEhjL=e< z10SU`i}UuKy?$zoMr`Cvx0$L!TxtHNzbY(p+H9n))S;nu(&(_9h^yn`>EY5!)2?zE zA37qEHFHs*cI*xUYp=l|k!7T-@>rkjg?;PPh!2_fOB!SXkagekN8&Dc74w4=^+F*VF`wi{~ zu;1Wb2m1}~b+F$Cy|!T*d4E(@wd-F`e(!%fJEru;{9Dg0U)o1(H`_h`B`bIR-;VBf zmHf?ZYWd|ccV=X5wb?HcS>5$!F6Vyxd*4q~t;_rORk>#W|7RV+{3|;pK9?k~+Ep4` zr@85WR?1o9s~Y_Ll=6 z4te^1JoVrmKktnxH@D=@p1sc7OzV%D^p#&1U6<;+PT|*)`5akO<@9jp@}*3~IQ*?4|ldi2Oc_UMk>-wj{Ve5%o-YM(lc5h8P(e$D; z^{(#G?(O`mPppYHQOw$7;w@pUC~Gy|t%buX}gl*V^s5 zoA=ch>sZ)UU(M3nyM5oLAFtoqUi(*Yam$W`the2=mkRH!`Q^$iWv3DM`D)9XscWK3 z^X|3zZGN5BcTUFe`8Umtd)7Q!6%i(-lsvK==5b2|n zzbi4|VBO|KZX}9&V(@N{ET4`wcU`t+1w3Cl z)z$x<*v)Cpzg?bAoZA;Ke7axrMR|JK9kIv|o)>>zE^e=O`R22I?$7z!*XDh^R0lt-FW)E&vS^_H_y5s%D^)7x}L(0h}8OYM|h_KU1a)1S;c z8dUyt`o;34C;rKY)%*!Qy5Mg3)*Rj4rT5GKI9#=R@09ZPh%&pV%q0E z3_VWN%txsM#Rr->M31jspN|@BqMCqxH)Iz;1$Z9su~H%^7vbBXVHkiIkE_+}f;GAtwiO zOW6lN1Pc&h+ZONr>!C?WtxyW?r(cW`jhSVKn9k?Qa2e-zVQxB43)^UTMo2%-X<_~Ep6ML<=}u{PXDbhhfUz+^s2s+et*i|Fs!n@W>{r= zgTBi427Q(7e_uBG^~%CtFXlaKer59iHeoUUNhS<=R-8=UO`kitI4I&0IZ9KYn14vC zB$EQ=-8azFIIj{HRF;GQAZwL{IiFcUZSM;9mD@VSzkzQ z_h4R}d2leSd+Y97m`hy^ynEAmclSX<^dU4)L3ayr0`BVqf_gFd&^jHuD8FRTcl^7m z7Z4u}Ej3lz=}AFcO^u%zQ;yFHBX8CXQ%_@}EV$M|lHDS1v1{dvS$_s8XvC?q`zetV z9yoW0o+gtf{6?Yj5?xAWFs%=PVpgTm7+RMxHymn195qEX@voZp6>LSd=3z_kF|p>CCA zxf!-itCP+9eq4ZwpC8e7%Zz))uhwB?^N4z&UOglaUjt|P59DyU0x7p|ewz|QQnQ7i zkcbpSUWI;9f7fLZtp0{=ZI8E(e_5K9_RO|Ga4p7kiS?Sf&+{;l^wiM_#hevrvQ!E^!~ z4r!VXfK|Co-LGT6%(`_O9LLx)n;;fiXQJIwifXh#n6?jA${=(Si+e#A50*;u$DH=n z5c;#rrgF-A1}V%mD7Jz|&4Bjxm?fiu%Sf!Fc2>g@2w6ir098ha4Ga-0~XU~<@D`} zToW8zjfQXcy$?=9wLc9)I2jeyigCaqYM;NfAT9?W_`%#I*@$=-Pq|e^pGhIfhh;D-U1I10h(=Y|pSJ<;$;Lz54(EKWF9%3kC+(t)4E9Ar-gYUf-C1IfCK9LvfGUJ?cAx`d=(5 zl5^ZO+3K5!V(OB$F2<9bJtSq>KD@Y5_~~EHJlUWq!w?>x3GdY-%kFu%)l}8_IbGow z6Hst&E{#2{0gK;l@)6D=TdEaU`EkT@1nQ5YnSLOQE~M6i%;J|J-{B+pEcI2LjM z9N)%3yiXy1$Kq2+2w?FkBm{``DJ0@R(RA~C#?~F5lV-m^|M~s>$n)RA&%Vo=d93eU z%?G1(n=Mv4S-k6GR=oY>`+5FJp-<=Xhosg@o!_#|t6+;x}K{_gcwv-5JwZkDai zsr~n_YO?Gxt?sj5N+z3Lb}5rxt>*u{(m4BGT4wIix@VEQ#9z-YwCVn+b+_I;vc|A8 zbN_0)@cdPC`b9+BubB?fIoAsvL zjKdkia{12w*X#{{&n%Pqt^RBg*ZY6(=FiytuQPILrq0A%=kjLp%Wn;q)#lug{a&|M z=FIy4MaK933(dCsat@+_8o z3dz4%@+l<$qU2NLoQow5xA8DyWNj)Yc-;QQQZ7NtE2{Vxi%&_hIFaKfsfv^ zyw6nYWnM1JlVW7=YBk9@9Fn)&w2UAqZ~Czzc+7olbQKE7DhTye3res}V|YbCiY`P&{{ zt-boN$4SZd?Aqp49F?n?q~8}_zjB@Ba^Qa5isU_IhcCYNKl41FZGTQs+^t%};tBHa zubtfV=gWJ={;Tf_oYo6SYjKZZ4D zzciO@=9x0B^sG<)h9?W(HH9fUee}&*`0cix7ytCV-}?58-L=?SR;zONjn}Kti{X!C z&)ivT8WMKPOzp`1^%7yb#hmJ@N;~!RS!ZVGUH6{!c;>?&2fz1ETaz*8&ziFL4{Ey= zvYZpy6m8@7K6%ymW`oUw7ta;dSNlxkM%C=oqb@5s33heG1*=mK43V+KqjcPJiWQMx&b9J5$5XI3KCIx%p>_(4wdB zp0@{05WdG&y64a>J*C6T|NA&7y*|A)Q`q*!rF7;cn}6J05y3I@-CEskdHZKI_cvX3i^0hwBK^p~(O0=#$j?VMn zdjCfIPwm*h#mcGe2ZOFi*_JK$>ndN{x&8PiiK1)a1u->q?akd=e(k$y$$n95Z>@9X z+}f{=hmIDj{8ms-U7FrQzqnb}l6m7g5D?kJRYO~@shV=pYpkHr8`7d&OT|17AzF>7R?sR%#E@GWtyhuiYYf#^ zY1P%Lp|}Jo+AA@ohKN~$2rV^4MH553)4$@ax7OQhoqg7CoxS%uzy14szk6qSy2Fpi zf@CEmB#t;a+Is`w&@{e>g@A-~g`1zMIUBt3oXy_cos4ytvVPK&49O0~w`1Rdpu2y;hCnbCpd@AP{H&v( z`oI=pd*J`Ue_;<0t|-CQmY%Ne+e_3SuDgvaE+ke|LBHVt=s(6nfUu(umx%z8>S_p&-_5RNLIza@J9V!{I~+bSsrg zwFZN;Aqm3u*{m!Xrkg@IQXLgN{;qRss`bSSG&_;(T!sK2J$zUl1ls2LWQdH@BP+MI zwptR`^z`+Uakx*GGcz3-L?SV?c5G^DH^2Yr`;Or&{nh2=a4m)Uh6cVVlgYedHeO_L z!_~SP4=?j}DjRD1rXIar^ZNDc^z`&T1_Su~%sLsDoGhw2{H3U{@VKUoySuxMRS*~q z7PAJgL`Jr(cNqCsBD!jxKY#x9Yt+Zy=H_!g`>*hZN*onns`;5SOcu+p#M9NoBcDum zb90-f#L?Moc6YZ^iD%SUO-Xh24c2SF@$qr9La>R+_1M_hFGFSDR*g+fNszpPg0bo8 zmAN^y#C9OBs!LRmk`i}iCA#%uInzn!;hG23#%6zcwEFH*4cxw%N+dE`(bqZer`hah zg@vMRK_t=P+Y;-ISS)_@NZHb|M@%#f}T)}CK_)j)9`MXdEYrBHQVwtbp{Qdpq zf3>=t&0AOiNm-sd=KzP}BLjloZvB&`q?n}xg9(x7=H_NaMMX7qEXB&m$mI>|lg1fy z^O2#U(!p!t;o-0x=CZ)p*m!SmPn}MPsmFbL$Af%58P;~JMv%FG?D4*9V-9cF16;P1b2<(_@%@USl>_`DIAdWkbJF)=-D zZEelC0Xce~+w|m#`W?ZWh=!n#6@Q$}{T&J=l1Kot(g)Lh%H0Ez$oaA==xT$)U>+R#Nu(Q`CX($(oubMu6R z1dszL1kD;5F{4!lQ$n%dhss<|=3ZkwhDzVRx_#(nYHF%LAh0U|lyiBFO_dWlVzEtt zvXRK5{QLk6W@%txU<$(L^H1jfRbM~MU>NJ`U&Ua0gcpIz4h+PIHh8yhOCCCOC=GR= zL^3rswTW9ejE)Kqr%g=Y!ouv!nT%=CLtPg&bmo0?+F0&yaQEW#(}RP2pSBE}+=||X zVN3&oK;WO+_^1NF0oW3qq`Agv3jwQE2UEP?`u7Lb!g6*tcrJc^D*N<*1k0mssXHSz zp#VT)dSZM$6r2n=$T5@P0ZaphLIE<~m8eCe%(P2Bbw36IVGy+r4h{fFFTEooBj3zU zGWz2I=Q;G;`h^1Qc~>f(p~kq{gHL{7cL~>aDYj_Dl6k7 zqoSil@po>mlw0SBn{xrNe#~Bm~v9`7nXt1^Q^tvx_nDlWt zoM9j2@2ZS8z5UR_!a_iZaw)r#aoS+5+I!WtGl`ise;)jBKv7!GQ46ef`+p_i%g1{+ WviuFIlz?lQgwq9g`zpK3>Hh)2VP>iT diff --git a/testing/resources/embedder_tests/set_positions_bengali2_skia_mac.png b/testing/resources/embedder_tests/set_positions_bengali2_skia_mac.png deleted file mode 100644 index 36b42b75f3a42d64cb75c20617d9cc5741b0bc93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1081 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCU}5ldaSW-r_4Y<>hIFaKfsfv^ zyw6nYWnM1JlVW7=YBk9@9Fn)&w2UAqZ~Czzc+7olbQKE7DhTye3res}V|YbCiY`P&{{ zt-boN$4SZd?Aqp49F?n?q~8}_zjB@Ba^Qa5isU_IhcCYNKl41FZGTQs+^t%};tBHa zubtfV=gWJ={;Tf_oYo6SYjKZZ4D zzciO@=9x0B^sG<)h9?W(HH9fUee}&*`0cix7ytCV-}?58-L=?SR;zONjn}Kti{X!C z&)ivT8WMKPOzp`1^%7yb#hmJ@N;~!RS!ZVGUH6{!c;>?&2fz1ETaz*8&ziFL4{Ey= zvYZpy6m8@7K6%ymW`oUw7ta;dSNlxkM%C=oqb@5s33heG1*=mK43V+KqjcPJiWQMx&b9J5$5XI3KCIx%p>_(4wdB zp0@{05WdG&y64a>J*C6T|NA&7y*|A)Q`q*!rF7;cn}6J05y3I@-CEskdHZKI_cvX3i^0hwBK^p~(O0=#$j?VMn zdjCfIPwm*h#mcGe2ZOFi*_JK$>ndN{x&8PiiK1)a1u->q?akd=e(k$y$$n95Z>@9X z+}f{=hmIDj{8ms-U7FrQzqnb}l6m7g5D+Ow=y>|=*S|45) zt}Zwv7r|7_-ldB z#;0zlwq<+U>`&}F_S~sz(zKTgqiZg%e_USuQYq7hf0NcV)3)5;b@`zi>sD{?*jTq$ zx7%y&R=aQOZs&h54XZsJxb)m|M?I}=-$l$qZ=ZU9|Ads>>qRv?pIeySPPTgP9DcIw z*Xyr8SW+~4@0JDrVt5(3%QI7L)7xb)f_>ILRN1xUu3=SA~7bFT>-Cy1&n>|MpavFH!9II`_}M oA5RbedSCZ)rz^>cW5W4k<<61%l8V;X4uF!Xr>mdKI;Vst0PF-XIRF3v diff --git a/testing/resources/embedder_tests/set_positions_bengali3.dump.txt b/testing/resources/embedder_tests/set_positions_bengali3.dump.txt new file mode 100644 index 0000000000..dac2a8ddea --- /dev/null +++ b/testing/resources/embedder_tests/set_positions_bengali3.dump.txt @@ -0,0 +1,9 @@ +SaveState +SetBaseClip [0,0,200,200] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,200.0000) line(0.0000,0.0000) line(200.0000,0.0000) line(200.0000,200.0000) line(0.0000,200.0000,close)] +SaveState +DrawDeviceText font="Noto Sans Bengali" size=20.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,40.0000,140.0000] glyphs=[(idx=4,u=U+09AA,origin=(0.0000,0.0000)) (idx=10,u=U+09BF,origin=(14.3200,0.0000)) (idx=6,u=U+09B0,origin=(19.6400,0.0000)) (idx=2,u=U+0995,origin=(31.5600,0.0000)) (idx=21,u=U+0015,origin=(47.7000,0.0000)) (idx=24,u=U+0018,origin=(55.7400,0.0000))] +DrawDeviceText font="Noto Sans Bengali" size=20.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,88.7400,141.6000] glyphs=[(idx=36,u=U+0024,origin=(0.0000,0.0000))] +DrawDeviceText font="Noto Sans Bengali" size=20.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,101.0200,140.0000] glyphs=[(idx=3,u=U+09A8,origin=(0.0000,0.0000)) (idx=9,u=U+09BE,origin=(12.0400,0.0000))] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/set_positions_bengali3.png b/testing/resources/embedder_tests/set_positions_bengali3.png deleted file mode 100644 index 49a70e8eec10742fafa37510b59e487e97e83e3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1083 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCU}5rfaSW-r_4Y=7j&Q2Xfseb( za<9i#$KKu=ZNy_W*GtCmW{;2OvZR#4md;`!j$N8s-QK-=!ICFsy1Pz=2#6ZbbawxC zXup1lM~9?A+gTF{-#^YV5d{)5NoA}N{Jmi)uI7ta+FLt+^LJ2+n^L6uS9QD_5P zdHS^l`5&J@|9brRz@IznEY=dym)Sz_-5lC(Kx( z%h&nuPu~mwr{AXAe|jKTzJIo*1rv~6J7Lt+2f?SMoNA$x+itnr-`mT#do4H>HF?k9?nO!r(N21(Zc2Y zdXpkqqpIVf-@ KKbLh*2~7ae!t?k5 diff --git a/testing/resources/embedder_tests/set_positions_bengali3_skia.png b/testing/resources/embedder_tests/set_positions_bengali3_skia.png deleted file mode 100644 index 1dd860da63e9de1edd5f8b970e400c7a6da123c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2590 zcmeHJ{Xf&|8+VeVNTktlMDnmEHDqC)j+k_o=Vvh!(Xm1z%sO%GXhtXxF)AgD8S{`P z3)w6jhYn&%dB{`NFj~y^{hYtz`~Bg2yRXF8{pCuF)7LFN{v>q}T$tYBIbj)BGqKg-1 z2Nx481wJ^DFou(N+|0~uzv{`rj+7rjWZoo06$H8|60SC19fPsFsewm8pm12RNF-{c z({VT)27^gXN-8Za-ILPQ-fqS64Go>m)|;qD$76qKBt{LDR4l50VxHZ^(HdFO!5mL?eqjD&A31Ne{awWu9$YvRj4(>?V5=63! zJRx4yo=h-E;+0L?{b+0%VPz#`Hnp}UL`SaxAnxq!AP|VgzwRsxlBmS-|U_x<}gD z+Q!7JcBaXa$>eA5i!7458JI+;$CcB5MkL(_HVX@%zgrZV?WHJcD}H3Wd|6XdbNB9D zR*n|)`sc3KuWgNu>$kR&vS*f-mkE0*bh?S5p)(Z3c=6&Zw{`HhGwaJM-8J>~^YoHa zX#3REj-JrZaNgp(=PAA-HL=I~MDtY*Ho%zJfHZYKFRv@uVH%FzSQ^jz*^lAgZ1!S@5cA4rr+BQ*{HbBT{2<LIF5y^LQ@Na*g>70C@ZHZ}qpd>aM>Dz~r? z|3#bPU6;oR1NieaP$3-9gp~~JuyytHV63}D;)C;Z!13)sI+B%$Gj8D9B zr7A708|Wq#Po98`{7rAI&5A@R;^3Z`8P>SX=owDryGm!>yq)duswyh{_&X#%T4v9l zze>;2f!hZSZ)?LXEWjidAO`}05D^x(TSf+v$bU3g1n{2E@pN@Pnu`Pq|I1+c)aYn9 zcVcMBEimxI$B)agM{E5gSo18?F2V*E=-9Kdx8nb`=JU_)=H#?WE;P1cCoRM@ zgqhh$3(UrbNuewQ-LmBuQy-r(vSq>^S=p(!IH$+17fRu7k6qgnS9PG!tkY-Wm;SNY zcNwLoC$~oFK&0xF@!+e4OB=ZQkp^;?DAXSyoIGDA+gJ+{*vK?^ZA?`0B8W` zQKsNrq>7S~+oemW^?iO?$x&HCv8v=ofii+rZmrgDc z3bKU5<sJP(5v2cERK{^@n)uO$-`6A%bQkc0yi^>>_x zb-H!#rulgnmzitTy}iAk;MA(B1w!GCM~d3tutLk?3zdM(WMv61g(sum)9e-&<$Z*Z zuSDjRLx&Dw7?Xc6S3>`+Fketa|CGrTFzwZN2SN92eQkH4f09d=(f!|drnRaCSLICL S9WubbPs;fm%7JPha_2vv7^STM diff --git a/testing/resources/embedder_tests/set_positions_bengali3_skia_mac.png b/testing/resources/embedder_tests/set_positions_bengali3_skia_mac.png deleted file mode 100644 index b07d1d62001bcb4cd3dbb2c069c7840ce68e62e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1097 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{=#;jKx9jP7LeL$-HD>U}5%jaSW-r z_4Y<>j&Q2Xfseb(-d>BVj=sHhwj|qJKh?e&Id02TKDVBD#KHVrMW7@&L~Od$+)&Ar zGTmLLLIeVhXY#mzYhPc#VuFBi0?+JBgIPbEVj>D8WRln>ZA;O){q*Cy_0q@e|E$*i z`S0J3-?rcHOtzVCQ@+1?;*nG#Apr%41_nkZ77iLSPR5-$dYVz_UEG=z=ZgM6ocX5h zPt@GtjStWI^50Kb%b8~UBxP#(^C=U3-baUAC^gJhyp{I)n~U7bIp0&uoc2ZjY5uY8 z$v%%y2PEJA@7@1)_ZO!v&9A4My_q54zDN7o`kg25No3@CyB)Z1W*+tUciXB}x6J+v zuk4$4PJd6S^!KHLLYZg3-V2<#JK;r#d*P~8k%ec=cP?HyOXl6Bh*x1}ejYm)Dwn2GpPg;%Vev{SmNB{(m^Mkp{qJ?RrylRT>`mrVX9i7}FTdsXH2cMFit4jMProhwIk)lWE9+T5 zY6H*NxTh}7`7Al1Api8{`L0P5BD-hyiO!UgxK|zfSL*4~m9~8>Px$vA{&_<`X}@>- zoSQGgr24b+E7^`#*=?i>8}-SRv0B?Scg@`43y z>!Qe>zEZ*9|Uo0rS&*yyW&P*`6t@>|LG9T9o&=0_WDrswS^Lg}w zW2fJr(aWD%ZBXdGcUr#Y7Lo7y-&l?1i*{YQq-<9>dour#@1o&MpSC4mT_KVEDdcyX zu}IOEX>&Vo&WU~WC*sVO=t&b!ZtWE1ygvKNt>lN#i&WpMPI&Rd=Xcuv56|n%=DvEd zb8FtxU5PJsJf{7tnUOcC_OJ29Ra5UyXrA}F{n1nN-HMZU_e-x&X#e+YzZj`mspkiK XnaP(h`;;I7P#NLr>gTe~DWM4f!XWFE diff --git a/testing/resources/embedder_tests/set_positions_bengali3_skia_mac_x86.png b/testing/resources/embedder_tests/set_positions_bengali3_skia_mac_x86.png deleted file mode 100644 index f3620cd8b16c85d9b7eebec7900409c41e83d5d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCU}5%jaSW-r_4Y=sk94ZcfsebV zZJUz4e#_E^#I&wOdYfi66uuCuiIkb>I;Z3GG|d-R1U-9|UPUzZtO#!3WqH5p@IswG z4`0i_nx@m1+jBF-cyXtGcS?$p@l4|!yNIpa1^t_-*_B&SabU zHs$-PCmwMX5)x2wXkcJuV&R}M<7DiKpWTc?@1j?oIOp~MU`C#E-P*IOZ+-Z+jD7va zYpg|*MSG5IPd?_6_FYHwjqUu+0=b(@tBv}<==?A;SG=$D*RdwL%wMJS!IW?RkKO+g zo2Gc{-`CT#@68cvuPI*}UmWXL?4F&jW%Xz7=f$=g^H;50`TmRjw09Y=e;&HNq0paA zabnr*_tUg)FS_U)cXZ{dw4-}3yzOkwDylg3c%{4H?w+~3jqa5^KRxNmt|cmWqnE@) zEvVSNwZ}1S{?_%sy*u7#pN`XgC;DsC7q#khxy4_WpSu;Z!`P($0av!c)cs*40W#~2 zzo&h=B=t@2-=8)AepHzFpPkPw`C4Q0SiJ~ zb8R}?k%YSNFU!4td&}=EJ@MtR+Rdyen?0u73T;pGHW%N{sZlznR_@4M|4md2hEzw&jg?-IpFsos^xBV-mm zpDwwRPjdIyqUzn-qGSIy{NG}iRV1c7V{5tU|WADHRP;G%B$wkRkupb z*e({QC;EG|*JMmy!>n{g#oM)!#igdy{qv5x<#%Sw3JCV)UKX&ei%wrJUvzx+wIj}~ zzWP<}es{`qm&Y|NpBKOF(aC+D7bln-?9WPNbos+=RF_b-pDSWwloGJECQnoIQuX$v+T(0B2<~x-qy2n=)8eV*~R+leL^T`KZ>q(m}_n!H= zv7;<9Xu`{_Cq+5UXI=TF{4hOd(t9S4oSJR5o9F-jY`@#D_8-ng`sNqv_ueUq1 z?Zi>%ixF2(<({Z}e|2%^r`fkBy!_rTwLXFU-?RNXQHf diff --git a/testing/resources/embedder_tests/set_positions_bengali3_skia_win.png b/testing/resources/embedder_tests/set_positions_bengali3_skia_win.png deleted file mode 100644 index 8fde85e1beaa255dc4bed632e15752f1a0f39bde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 752 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{^DCVA}5K;uunK>+Ow&eRr%xj(vPz z>GhXy`VTwjfRn1v#98zWv?F>$sy=uNCTxc62=7*Z%)sXl>0N8_}!BwWem|b7*E-PhTByBOR)b3ZT2S6J&2e!^;Qy1(qU>r1w@U0VKL z@olc6t>?<`Q-0O3XS!;B3(BcJed_cwGpEV6Cb``~ckNc(yr*=_P~qO~Xp@YU3zxu4Y}-# zTgY2TB%l0W@rt?GEY**QByIXhZ^1@Zu`W0>4 zSAQy%zq!0bd)r=*Syk2%KmQu4OnF+`LyEM&jWOSDes@KzUrqy(4I>x|Mok5TXMCY`N-Dd^{gbOnF-M~ YtS|Peh&g0FFa;%LPgg&ebxsLQ0M&Iq5&!@I diff --git a/testing/resources/embedder_tests/truetype_font_text.dump.txt b/testing/resources/embedder_tests/truetype_font_text.dump.txt new file mode 100644 index 0000000000..1316de2ca7 --- /dev/null +++ b/testing/resources/embedder_tests/truetype_font_text.dump.txt @@ -0,0 +1,8 @@ +SaveState +SetBaseClip [0,0,612,792] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,792.0000) line(0.0000,0.0000) line(612.0000,0.0000) line(612.0000,792.0000) line(0.0000,792.0000,close)] +SaveState +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,400.0000,392.0000] glyphs=[(idx=44,u=U+0049,origin=(0.0000,0.0000)) (idx=3,u=U+0020,origin=(3.3240,0.0000)) (idx=68,u=U+0061,origin=(6.6480,0.0000)) (idx=80,u=U+006D,origin=(13.3200,0.0000)) (idx=3,u=U+0020,origin=(23.3160,0.0000)) (idx=87,u=U+0074,origin=(26.6400,0.0000)) (idx=72,u=U+0065,origin=(29.9640,0.0000)) (idx=86,u=U+0073,origin=(36.6360,0.0000)) (idx=87,u=U+0074,origin=(42.6360,0.0000)) (idx=76,u=U+0069,origin=(45.9600,0.0000)) (idx=81,u=U+006E,origin=(48.6240,0.0000)) (idx=74,u=U+0067,origin=(55.2960,0.0000)) (idx=3,u=U+0020,origin=(61.9680,0.0000)) (idx=80,u=U+006D,origin=(65.2920,0.0000)) (idx=92,u=U+0079,origin=(75.2880,0.0000)) (idx=3,u=U+0020,origin=(81.2880,0.0000)) (idx=79,u=U+006C,origin=(84.6120,0.0000)) (idx=82,u=U+006F,origin=(87.2760,0.0000)) (idx=68,u=U+0061,origin=(93.9480,0.0000)) (idx=71,u=U+0064,origin=(100.6200,0.0000)) (idx=72,u=U+0065,origin=(107.2920,0.0000)) (idx=71,u=U+0064,origin=(113.9640,0.0000)) (idx=3,u=U+0020,origin=(120.6360,0.0000)) (idx=73,u=U+0066,origin=(123.9600,0.0000)) (idx=82,u=U+006F,origin=(127.2840,0.0000)) (idx=81,u=U+006E,origin=(133.9560,0.0000)) (idx=87,u=U+0074,origin=(140.6280,0.0000)) (idx=15,u=U+002C,origin=(143.9520,0.0000)) (idx=3,u=U+0020,origin=(147.2760,0.0000)) (idx=58,u=U+0057,origin=(150.6000,0.0000)) (idx=40,u=U+0045,origin=(161.9160,0.0000)) (idx=40,u=U+0045,origin=(169.9080,0.0000)) (idx=17,u=U+002E,origin=(177.9000,0.0000))] +DrawDeviceText font="Arimo" size=15.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,200.0000,592.0000] glyphs=[(idx=37,u=U+0042,origin=(0.0000,0.0000)) (idx=76,u=U+0069,origin=(9.9900,0.0000)) (idx=74,u=U+0067,origin=(13.3200,0.0000)) (idx=74,u=U+0067,origin=(21.6600,0.0000)) (idx=72,u=U+0065,origin=(30.0000,0.0000)) (idx=85,u=U+0072,origin=(38.3400,0.0000)) (idx=3,u=U+0020,origin=(43.3350,0.0000)) (idx=73,u=U+0066,origin=(47.4900,0.0000)) (idx=82,u=U+006F,origin=(51.6450,0.0000)) (idx=81,u=U+006E,origin=(59.9850,0.0000)) (idx=87,u=U+0074,origin=(68.3250,0.0000)) (idx=3,u=U+0020,origin=(72.4800,0.0000)) (idx=86,u=U+0073,origin=(76.6350,0.0000)) (idx=76,u=U+0069,origin=(84.1350,0.0000)) (idx=93,u=U+007A,origin=(87.4650,0.0000)) (idx=72,u=U+0065,origin=(94.9650,0.0000))] +RestoreState +RestoreState diff --git a/testing/resources/embedder_tests/truetype_font_text_agg.png b/testing/resources/embedder_tests/truetype_font_text_agg.png deleted file mode 100644 index 1f18fb53f0a831a0a907ac3277025f52cc0fdf3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3610 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 NgPRN7neG_${cj=}O6C9n diff --git a/testing/resources/embedder_tests/truetype_font_text_skia_mac.png b/testing/resources/embedder_tests/truetype_font_text_skia_mac.png deleted file mode 100644 index c2f857f9188bfc48268c043abdc9924dc0ff4d26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3319 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 S4}`y3sp#nkXf0`*TaSW-r_4d|5?~p)|xg95 z4%@|Zmd={kV)NDPx*XpNrx0VI39X0nI;U)1WmN)Xue9B5WOV6OsNyb3&J$b89rntU z0!6oWz3N!AZUxZfNk{EM_gGtJdwid|A}#03#F-OU{CX91=0-z_$m??5qdZ`TF|`Ok zlArKlP2H>{Hd7`RuyZ*sS136A6Me*U_5P1l5GS15S!%mHTzt{2i4AAu--=Wg6h&TM zID6tA`Hwu^d(Lxb0j(37Ab*cvNxxRnw*7cw3cyRJo}^8zDO%O{^XXt zjjKTpX|4R*zc-0(t}MtlGyYG@Z1rC2)+#+*W*F}Li_6JqVxf{w^1Q-uXSHH`&+CHs zca(_e?vxVJ%L7$40` zx|Fe^f5r@xSq(a0eayGJ>Nc?09M76(ZRTJke{V3=eHSnRj&luj_U2 z`LmuC5_}t64cR04BAF^*^fTQwns8(F>bK>(4Hmxav(~-UEw)cNcU|+N6t_a~yu^uN z+|#aY`M%hrn{~p}NxLd;#Ah80fBpI3-*&w@TNm~pNmG8ab(=`ax`(r6Cpdh|wpK9y z$z0};*4_5D;m?=;+l-Mm-|zCB_$BO}S9V0z{0;uunK z>+P-k*=Gx7j(-eJ&U}<&B$=$~yK$Ljmvq)iR@JT258E!KYzxcD*d1`XHAPQjcBbB+ z6}qo>Se;()wmUd)jhbL~%IhV%eK$W8J%0VfO>d9=?eBL#|K_);F0s3R{(14e=PFO0 zcrq|Dv2X||IQ(%u_FCoTHQUouavzI7sdbvfH)mtZ4YP(b5gtY}eV$1>>qzV9Dmd&| z#4t1N#EqlR>|W1ERc=Z-J$u)wyjxa2(t=BhmzSh3);+RC(D4=b=~G_bIf~1AIf@=_ z`1?EKR)>Or*F7)E=#I?C-`ADa6(0R0_PGDZris?>cD83{>FXVKaQ~Y?2%N-I;edg%oBjxM>B$}}hhu=ggs`VzGn)Q62Ii95c+(MLs@JY)6MF;oJ-W6vJ|~(6h3kHx}U;JNA(G%>T@0J{EA$mk<$Q6 fMI;R~1gKv}`l)z4*}Q$iB}xkg+t diff --git a/testing/resources/embedder_tests/vertical_text_positioned_skia_mac.png b/testing/resources/embedder_tests/vertical_text_positioned_skia_mac.png deleted file mode 100644 index 40853b503e405f0f301ef853919a48a7a0ce206b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 874 zcmeAS@N?(olHy`uVBq!ia0vp^CqS43NHBC5e{=#;jKx9jP7LeL$-HD>U{>*TaSW-r z_4d|5?~p)|xg954%@|Zmd={kV)NDPx*XpNrx0VI39X0nI;U)1WmN)Xue9B5WOV6O zsNyb3&J$b89rntU0!6oWz3N!AZUxZfNk{EM_gGtJdwid|A}#03#F-OU{CX91=0-z_ z$m??5qdZ`TF|`OklArKlP2H>{Hd7`RuyZ*sS136A6Me*U_5P1l5GS15S!%mHTzt{2 zi4AAu--=Wg6h&TMID6tA`Hwu^d(Lxb0j(37Ab*cvNxxRnw*7cw3cyR zJo}^8zDO%O{^XXtjjKTpX|4R*zc-0(t}MtlGyYG@Z1rC2)+#+*W*F}Li_6JqVxf{w z^1Q-uXSHH`&+CHsca(_e?vxVJ%L7$40`x|Fe^f5r@xSq(a0eayGJ>Nc?09M76(ZRTJke{V z3=eHSnRj&luj_U2`LmuC5_}t64cR04BAF^*^fTQwns8(F>bK>(4Hmxav(~-UEw)cN zcU|+N6t_a~yu^uN+|#aY`M%hrn{~p}NxLd;#Ah80fBpI3-*&w@TNm~pNmG8ab(=`a zx`(r6Cpdh|wpK9y$z0};*4_5D;m?=;+l-Mm-|zCB_$BO}S90u!N{b*_>+ra{;q8`H-DtBtz1(+H_i3Be)^f<`yT=>Yn(VK+`z!d#KIw< zz^CXsDa!b)(OHiB`dz|dG`eT#f*$U@Pf2&N+Ryanz3EJK|Bduk9VgK$k&!7MxS%GV~?FkDKyzV$}jgc)gj%GV}) zUi@Kn#pLm8+oYQK)Hw%d%YrQW$9HMflEt1{->*#A_VjUsK`Bmzf=1dfeJ?|KGM655xDDor88PkvacTQPpeJ!+CN}ou6z@ zbof2y01*OkLc*hrN%CT*%;xOg7bbjF{XRA_`xTbTFX#5~ILf)iYG%~r@K~UK<$lJW z=y+e(?%-Cl9`0kF78Csm3{M;gw(o2qVZ&C{3X*`XN-i&h8H87H=! Z=U4Z8<7@q5QU@rJdAj Date: Wed, 14 Oct 2026 17:49:08 -0700 Subject: [PATCH 33/37] Clean up CPDF_SyntaxParser constructors - Remove CPDF_SyntaxParser::CreateForTesting() and inline the implementation into the only caller. - Rename variable names in remaining ctors to use Google C++ style. - Add inline comment to help document what "0" is. Change-Id: I8f584ec4295bf8e0d9bb1cf1994423f6750a9f8a Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160991 Commit-Queue: Lei Zhang Reviewed-by: Tom Sepez --- core/fpdfapi/parser/cpdf_parser_unittest.cpp | 7 +++++-- core/fpdfapi/parser/cpdf_syntax_parser.cpp | 19 +++++-------------- core/fpdfapi/parser/cpdf_syntax_parser.h | 10 +++------- 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/core/fpdfapi/parser/cpdf_parser_unittest.cpp b/core/fpdfapi/parser/cpdf_parser_unittest.cpp index ecfd50f236..992d78fc5f 100644 --- a/core/fpdfapi/parser/cpdf_parser_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_parser_unittest.cpp @@ -15,6 +15,7 @@ #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_linearized_header.h" #include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_read_validator.h" #include "core/fpdfapi/parser/cpdf_syntax_parser.h" #include "core/fxcrt/cfx_fileaccess_stream.h" #include "core/fxcrt/cfx_read_only_span_stream.h" @@ -121,8 +122,10 @@ class CPDF_TestParser final : public CPDF_Parser { // Setup reading from a buffer and initial states. bool InitTestFromBufferWithOffset(pdfium::span buffer, FX_FILESIZE header_offset) { - SetSyntaxParserForTesting(CPDF_SyntaxParser::CreateForTesting( - pdfium::MakeRetain(buffer), header_offset)); + SetSyntaxParserForTesting(std::make_unique( + pdfium::MakeRetain( + pdfium::MakeRetain(buffer), nullptr), + header_offset)); return true; } diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp index 01246ba95a..3f95c68d68 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp +++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp @@ -78,26 +78,17 @@ class ReadableSubStream final : public IFX_SeekableReadStream { // static uint32_t CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; -// static -std::unique_ptr CPDF_SyntaxParser::CreateForTesting( - RetainPtr pFileAccess, - FX_FILESIZE HeaderOffset) { - return std::make_unique( - pdfium::MakeRetain(std::move(pFileAccess), nullptr), - HeaderOffset); -} - CPDF_SyntaxParser::CPDF_SyntaxParser( - RetainPtr pFileAccess) + RetainPtr file_access) : CPDF_SyntaxParser( - pdfium::MakeRetain(std::move(pFileAccess), + pdfium::MakeRetain(std::move(file_access), nullptr), - 0) {} + /*header_offset_=*/0) {} CPDF_SyntaxParser::CPDF_SyntaxParser(RetainPtr validator, - FX_FILESIZE HeaderOffset) + FX_FILESIZE header_offset) : file_access_(std::move(validator)), - header_offset_(HeaderOffset), + header_offset_(header_offset), file_len_(file_access_->GetSize()) { DCHECK_LE(header_offset_, file_len_); } diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.h b/core/fpdfapi/parser/cpdf_syntax_parser.h index 183aee554e..fec30dc248 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.h +++ b/core/fpdfapi/parser/cpdf_syntax_parser.h @@ -40,13 +40,9 @@ class CPDF_SyntaxParser { static constexpr uint32_t kParserMaxRecursionDepth = 64; - static std::unique_ptr CreateForTesting( - RetainPtr pFileAccess, - FX_FILESIZE HeaderOffset); - - explicit CPDF_SyntaxParser(RetainPtr pFileAccess); - CPDF_SyntaxParser(RetainPtr pValidator, - FX_FILESIZE HeaderOffset); + explicit CPDF_SyntaxParser(RetainPtr file_access); + CPDF_SyntaxParser(RetainPtr validator, + FX_FILESIZE header_offset); ~CPDF_SyntaxParser(); void SetReadBufferSize(uint32_t read_buffer_size) { From c10905a91dc44b77c0bb0f883a382b7ad7100d6a Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Thu, 15 Oct 2026 10:03:53 -0700 Subject: [PATCH 34/37] Fix building cpvt_section_unittest.cpp with GCC Move struct LayoutTestData out of the anonymous namespace inside cpvt_section_unittest.cpp. The existing code causes GCC to fail with -Werror=subobject-linkage. Change-Id: If224f666c2a702d21a13d31d51e8c0e05a926d71 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160971 Reviewed-by: Andy Phan Commit-Queue: Lei Zhang --- core/fpdfdoc/cpvt_section_unittest.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/fpdfdoc/cpvt_section_unittest.cpp b/core/fpdfdoc/cpvt_section_unittest.cpp index 472a2bfdcd..60bcb89029 100644 --- a/core/fpdfdoc/cpvt_section_unittest.cpp +++ b/core/fpdfdoc/cpvt_section_unittest.cpp @@ -26,12 +26,6 @@ constexpr uint16_t kHebrewGimel = 0x05D2; enum class TextContent { kEnglishAndHebrew, kHebrewAndEnglish }; -struct LayoutTestData { - TextContent content; - CFX_BidiResolver::ParagraphDirection direction; - pdfium::span expected_visual_order; -}; - // For `TextContent::kEnglishAndHebrew`: `kAuto` uses the Unicode Bidirectional // Algorithm, which resolves to LTR because the first strong character is // English. The RTL run [w4, sp4, w5] (indices 6, 7, 8) has its words ordered @@ -48,6 +42,12 @@ constexpr int kHebrewAndEnglishLtr[] = {4, 3, 2, 1, 0, 5, 6, 7, 8}; } // namespace +struct LayoutTestData { + TextContent content; + CFX_BidiResolver::ParagraphDirection direction; + pdfium::span expected_visual_order; +}; + class CPVT_SectionTest : public testing::Test { public: void SetUp() override { From 609a364f74507898bdd00e8fd5a6fd5b48f75d75 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Thu, 15 Oct 2026 11:19:30 -0700 Subject: [PATCH 35/37] pdfium_test: With --render-repeats, do full loads on each repeat Previously, form_callbacks kept per-page data alive after a page was processed. Now, --render-repeats measures image decode time in each repeat. (When using --pages=1..10, form_fill_info_->loaded_pages keeps per-page image caches alive for all pages still, so decoding many pages needs memory for the images of all pages still. See an earlier patch set on the CL for a different approach that changes that too.) Follow-up to https://pdfium-review.googlesource.com/c/pdfium/+/132470 Bug: none Change-Id: Ief69b738ce21f9e82c0f9a95a63f4ec201a9cfc8 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160790 Reviewed-by: Nico Weber Reviewed-by: Lei Zhang Commit-Queue: Nico Weber --- testing/pdfium_test/pdfium_test.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/testing/pdfium_test/pdfium_test.cc b/testing/pdfium_test/pdfium_test.cc index ba62536d58..dd881e2fe7 100644 --- a/testing/pdfium_test/pdfium_test.cc +++ b/testing/pdfium_test/pdfium_test.cc @@ -1889,6 +1889,14 @@ void Processor::ProcessPdf(const std::string& name, } Idle(form.get()); } + + // Clear per-page caches on every repetition, to measure image decode + // on every repeat. + for (auto& [_, page] : form_callbacks.loaded_pages) { + FORM_OnBeforeClosePage(page.get(), form.get()); + } + form_callbacks.loaded_pages.clear(); + Idle(form.get()); } FORM_DoDocumentAAction(form.get(), FPDFDOC_AACTION_WC); From ab5e0a9a5e8461a9f0618fd1a1112b39547c26db Mon Sep 17 00:00:00 2001 From: Jeroen Bobbeldijk Date: Thu, 15 Oct 2026 13:03:32 -0700 Subject: [PATCH 36/37] Resample the horizontal stretch's 1- and 2-tap columns with Highway ContinueStretchHorz() resamples one destination column at a time. Its modal tap counts are 1 (no scaling in this axis) and 2 (bilinear interpolation), so a bilinear row is a long run of columns doing the same two multiply-accumulates on neighbouring source pixels, and that pass is the largest single cost of rendering image-heavy pages. Four consecutive columns sharing a tap count, whose source pixels lie within 16 or 32 bytes of each other, are now resampled together: one vectorized gather per tap pulls all four columns' source bytes into 32-bit lanes, one multiply-accumulate per tap does the arithmetic for all four, and the result is packed and stored as one vector. The arithmetic is the per-column path's, in tap order, on the same bytes with the same weights, so the output is identical bit for bit. PlanHorzGroups() runs once per stretch, after the weight table: it finds maximal spans of same-tap-count columns, and for each whole group of four within a span whose combined source window fits the gather it precomputes the gather indices and weights (StretchHorzGroup). A span is planned only if at least three in four of its groups fit; consecutive fitting groups form a run (StretchHorzRun), which is the unit the kernel handles per call. Columns not covered -- an odd tap count, a short span, a group whose window does not fit -- take the per-column path unchanged. The kernels live in cstretchengine_hwy.cpp and use Highway. Three arms are covered: - k8BppTo8Bpp and kManyBpptoManyBpp (BGR and BGRx destinations): StretchHorzRunSimd(), overloaded on the destination pixel type. 1bpp sources take the k8BppTo8Bpp arm too, on the row Expand1BppRow() produces, so the plan for them is made against that expanded row. - kManyBpptoManyBppWithAlpha: StretchHorzRunAlphaSimd(), where each tap's weight is weight * src.alpha / 255 -- a per-lane truncating divide that depends on the gathered alpha, so it is computed in the kernel with the exact reciprocal-multiply trick for division by 255 (the (x + 1 + (x >> 8)) >> 8 approximation would be wrong here: weight * alpha reaches 65536 * 255, past where it is exact). The kernels take the source row and destination as spans and process a whole run per call, so the runtime target selection and the call happen once per run (hundreds of groups for an unclipped bilinear row) rather than once per four columns. Stores are packed vectors: 4 bytes for 8bpp, 16 bytes for BGRA and for BGRx (whose 4th bytes are read back from the destination and kept, as the per-column path leaves them untouched), and 8 + 4 bytes for BGR so that nothing is written past the 12 bytes a group owns. The new unit tests compare every kernel, over a small fixed set of groups and windows chosen to cover known edges (gather positions at the start/middle/end of the window, weights at both ends and the midpoint of the fixed-point range) for each (taps, window width) variant, against a scalar re-derivation of what a group is documented to compute, including the bytes a group must not touch, and check that a run is processed in full. Bug: 559426535 Change-Id: I4f5e3e977b4f6f9b184988ae518cf70abd868a20 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/158070 Reviewed-by: Tom Sepez Commit-Queue: Lei Zhang Reviewed-by: Lei Zhang --- DEPS | 6 +- core/fxge/BUILD.gn | 7 +- core/fxge/dib/DEPS | 3 + core/fxge/dib/cstretchengine.cpp | 252 ++++++++++++- core/fxge/dib/cstretchengine.h | 64 ++++ core/fxge/dib/cstretchengine_hwy.cpp | 425 ++++++++++++++++++++++ core/fxge/dib/cstretchengine_hwy.h | 59 +++ core/fxge/dib/cstretchengine_unittest.cpp | 251 +++++++++++++ 8 files changed, 1058 insertions(+), 9 deletions(-) create mode 100644 core/fxge/dib/DEPS create mode 100644 core/fxge/dib/cstretchengine_hwy.cpp create mode 100644 core/fxge/dib/cstretchengine_hwy.h diff --git a/DEPS b/DEPS index 0791d81c65..65e48c209a 100644 --- a/DEPS +++ b/DEPS @@ -450,11 +450,9 @@ deps = { Var('chromium_git') + '/external/github.com/harfbuzz/harfbuzz.git@' + Var('harfbuzz_revision'), - 'third_party/highway/src': { - 'url': Var('chromium_git') + '/external/github.com/google/highway.git@' + + 'third_party/highway/src': + Var('chromium_git') + '/external/github.com/google/highway.git@' + Var('highway_revision'), - 'condition': 'checkout_v8', - }, 'third_party/icu': Var('chromium_git') + '/chromium/deps/icu.git@' + Var('icu_revision'), diff --git a/core/fxge/BUILD.gn b/core/fxge/BUILD.gn index 14dfe06ed5..296e7ab77d 100644 --- a/core/fxge/BUILD.gn +++ b/core/fxge/BUILD.gn @@ -79,6 +79,8 @@ source_set("fxge") { "dib/cfx_scanlinecompositor.h", "dib/cstretchengine.cpp", "dib/cstretchengine.h", + "dib/cstretchengine_hwy.cpp", + "dib/cstretchengine_hwy.h", "dib/fx_dib.cpp", "dib/fx_dib.h", "dib/scanlinecomposer_iface.h", @@ -116,7 +118,10 @@ source_set("fxge") { "../../:pdfium_noshorten_config", ] public_deps = [ "../fxcrt" ] - deps = [ "//third_party/abseil-cpp:absl" ] + deps = [ + "//third_party/abseil-cpp:absl", + "//third_party/highway:libhwy", + ] defines = [] if (is_android) { diff --git a/core/fxge/dib/DEPS b/core/fxge/dib/DEPS new file mode 100644 index 0000000000..da5267ae6b --- /dev/null +++ b/core/fxge/dib/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + '+third_party/highway', +] diff --git a/core/fxge/dib/cstretchengine.cpp b/core/fxge/dib/cstretchengine.cpp index e912879f5f..82075b686b 100644 --- a/core/fxge/dib/cstretchengine.cpp +++ b/core/fxge/dib/cstretchengine.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -19,12 +20,14 @@ #include "core/fxcrt/fx_ceil_div.h" #include "core/fxcrt/fx_safe_types.h" #include "core/fxcrt/fx_system.h" +#include "core/fxcrt/numerics/safe_conversions.h" #include "core/fxcrt/pauseindicator_iface.h" #include "core/fxcrt/span_util.h" #include "core/fxcrt/zip.h" #include "core/fxge/calculate_pitch.h" #include "core/fxge/dib/cfx_dibbase.h" #include "core/fxge/dib/cfx_dibitmap.h" +#include "core/fxge/dib/cstretchengine_hwy.h" #include "core/fxge/dib/fx_dib.h" #include "core/fxge/dib/scanlinecomposer_iface.h" @@ -332,11 +335,206 @@ bool CStretchEngine::StartStretchHorz() { return false; } } + PlanHorzGroups(); cur_row_ = src_clip_.top; state_ = State::kHorizontal; return true; } +void CStretchEngine::PlanHorzGroups() { + horz_groups_.clear(); + horz_runs_.clear(); + if (dest_clip_.Width() <= 0) { + return; + } + if (!StretchHorzSimdAvailable()) { + // No vector wide enough for the kernel's gather exists in this build + // (see the HWY_SCALAR branch of cstretchengine_hwy.cpp): leave + // `horz_groups_` and `horz_runs_` empty, so every column takes the + // per-column path below, unchanged, rather than planning groups nothing + // can process. + return; + } + // The two palette arms have no group kernel; every other arm does. (1bpp + // sources take the k8BppTo8Bpp arm, on the row Expand1BppRow() produces.) + if (trans_method_ == TransformMethod::k1BppToManyBpp || + trans_method_ == TransformMethod::k8BppToManyBpp) { + return; + } + + HorzPlanParams params; + // The source pixel stride the gather reads: one byte for k8BppTo8Bpp and + // for an expanded 1bpp row, or the full pixel for kManyBpptoManyBpp / + // WithAlpha (3 or 4, per trans_method_'s own precondition on src_bpp_; + // WithAlpha is always 4). + const bool one_byte_pixels = trans_method_ == TransformMethod::k1BppTo8Bpp || + trans_method_ == TransformMethod::k8BppTo8Bpp; + params.bpp = one_byte_pixels ? 1 : src_bpp_ / 8; + // How many leading bytes of each source pixel a group loads: fewer than + // `bpp` when the 4th byte of a 4-byte pixel is padding the kernel never + // reads, matching the per-column path. WithAlpha reads all 4 bytes: its + // kernel needs the alpha byte the non-alpha kernel treats as padding. + if (trans_method_ == TransformMethod::kManyBpptoManyBppWithAlpha) { + params.gathered = params.bpp; + } else if (params.bpp == 1) { + params.gathered = 1; + } else { + params.gathered = 3; + } + // The row the kernel will read. For a 1bpp source that is the expanded + // row, which StartStretchHorz() has already sized: whole source bytes of 8 + // pixels each, so up to 7 bytes past src_width_ (see Expand1BppRow()). + if (trans_method_ == TransformMethod::k1BppTo8Bpp) { + params.src_row_bytes = expanded_row_.size(); + } else { + params.src_row_bytes = Fx2DSizeOrDie(src_width_, params.bpp); + } + + // Walk the destination columns in maximal spans of the same tap count and + // plan each span. + int span_start = dest_clip_.left; + uint32_t span_taps = HorzTapCountAt(span_start); + for (int col = span_start + 1; col <= dest_clip_.right; ++col) { + const uint32_t taps = col < dest_clip_.right ? HorzTapCountAt(col) : 0; + if (col == dest_clip_.right || taps != span_taps) { + PlanHorzSpan(span_start, col, span_taps, params); + span_start = col; + span_taps = taps; + } + } +} + +// A destination column's tap count if the kernel handles it (1 or 2), else 0. +uint32_t CStretchEngine::HorzTapCountAt(int col) const { + const size_t weight_count = + weight_table_.GetPixelWeight(col)->GetWeights().size(); + if (weight_count == 1) { + return 1; + } + if (weight_count == 2) { + return 2; + } + return 0; +} + +// A span shorter than this stays on the per-column path entirely: even one +// group's setup -- four weight-table lookups plus the index/weight plan -- +// costs more than the per-column dispatch it would replace. +constexpr int kMinSpanLength = 4; + +// Plans one maximal span [start, end) of columns sharing `taps`: chops it +// into groups of 4 and, if at least 3 in 4 of them fit the gather, adds all +// the fitting ones, consecutive fitting groups forming one run. Below that +// share a fitting minority is all cost, since the span's leftover columns -- +// including every non-fitting group -- fall back to the per-column path +// regardless. Spans with taps 0 (neither 1 nor 2) are never planned, nor +// spans shorter than kMinSpanLength. +void CStretchEngine::PlanHorzSpan(int start, + int end, + uint32_t taps, + const HorzPlanParams& params) { + if (taps == 0 || end - start < kMinSpanLength) { + return; + } + const int candidate_groups = (end - start) / 4; + // Builds directly into `horz_groups_` and `horz_runs_`; reverted below if + // too few groups fit. `original_last_run` guards the one case a plain + // `horz_runs_.resize()` wouldn't undo: this span's first group extending a + // run from an earlier span, mutating its `group_count` in place. + const size_t original_group_count = horz_groups_.size(); + const size_t original_run_count = horz_runs_.size(); + const std::optional original_last_run = + horz_runs_.empty() ? std::nullopt + : std::make_optional(horz_runs_.back()); + int fitting = 0; + for (int i = 0; i < candidate_groups; ++i) { + std::optional group = + BuildHorzGroup(start + 4 * i, taps, params); + if (!group.has_value()) { + continue; + } + ++fitting; + // Extend the current run if this group's columns follow its last group's + // directly; otherwise this group starts a new run. + const int dest_col = start + 4 * i; + if (!horz_runs_.empty() && + horz_runs_.back().dest_col + 4 * horz_runs_.back().group_count == + static_cast(dest_col)) { + ++horz_runs_.back().group_count; + } else { + horz_runs_.push_back({dest_col, horz_groups_.size(), 1}); + } + horz_groups_.push_back(group.value()); + } + if (fitting * 4 < candidate_groups * 3) { + horz_groups_.resize(original_group_count); + horz_runs_.resize(original_run_count); + if (original_last_run.has_value()) { + horz_runs_.back() = original_last_run.value(); + } + } +} + +// Builds the group covering the 4 destination columns starting at `col`, all +// already known to share `taps`, or returns nullopt if the four columns' +// combined source window does not fit a 16- or 32-byte gather. +// `weight->GetSrcStart()` is a source pixel position; the plan is in bytes. +std::optional CStretchEngine::BuildHorzGroup( + int col, + uint32_t taps, + const HorzPlanParams& params) const { + size_t min_start = weight_table_.GetPixelWeight(col)->GetSrcStart(); + size_t max_start = min_start; + for (int i = 1; i < 4; ++i) { + const size_t start = weight_table_.GetPixelWeight(col + i)->GetSrcStart(); + min_start = std::min(min_start, start); + max_start = std::max(max_start, start); + } + const size_t span_bytes = (max_start - min_start + taps) * params.bpp; + if (span_bytes > 32 || params.src_row_bytes < 16) { + return std::nullopt; + } + const bool wide = span_bytes > 16; + const size_t load_bytes = wide ? 32 : 16; + if (load_bytes > params.src_row_bytes) { + return std::nullopt; + } + // Keep the load inside the source row, sliding its base left if needed + // (mirrors the per-column path's own subspan, which is always in bounds). + size_t src_byte_base = min_start * params.bpp; + if (src_byte_base + load_bytes > params.src_row_bytes) { + src_byte_base = params.src_row_bytes - load_bytes; + } + + StretchHorzGroup group; + group.taps = taps; + group.src_byte_base = src_byte_base; + group.wide = wide; + std::ranges::fill(group.idx[0], 0xFF); + std::ranges::fill(group.idx[1], 0xFF); + for (int k = 0; k < 4; ++k) { + const PixelWeight* weight = weight_table_.GetPixelWeight(col + k); + pdfium::span weights = weight->GetWeights(); + group.weights[0][k] = weights[0]; + group.weights[1][k] = taps == 2 ? weights[1] : 0; + for (uint32_t t = 0; t < taps; ++t) { + const size_t src_byte = + (weight->GetSrcStart() + t) * params.bpp - src_byte_base; + for (uint32_t c = 0; c < params.gathered; ++c) { + // Within the 32-byte window, so it fits the byte the gather reads. + group.idx[t][k * 4 + c] = pdfium::checked_cast(src_byte + c); + } + } + } + return group; +} + +// The groups of one planned run, in `horz_groups_`. +pdfium::span CStretchEngine::HorzRunGroups( + const StretchHorzRun& run) const { + return pdfium::span(horz_groups_).subspan(run.first_group, run.group_count); +} + bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { if (!dest_width_) { return false; @@ -367,7 +565,22 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { src_row_span = Expand1BppRow(src_row_span); [[fallthrough]]; case TransformMethod::k8BppTo8Bpp: { - for (int col = dest_clip_.left; col < dest_clip_.right; ++col) { + pdfium::span runs(horz_runs_); + for (int col = dest_clip_.left; col < dest_clip_.right;) { + if (!runs.empty() && runs.front().dest_col == col) { + // A run of the 4-column groups PlanHorzGroups() found: one + // gather, one multiply-accumulate per tap, covering 4 columns at + // once. The index plan and weights come from the weight table, + // copied verbatim, and the terms are summed in tap order, so the + // output matches the per-column path below bit for bit. + const StretchHorzRun& run = runs.front(); + StretchHorzRunSimd(HorzRunGroups(run), src_row_span, + dest_span.subspan(dest_span_index)); + dest_span_index += 4 * run.group_count; + col += 4 * run.group_count; + runs = runs.subspan<1u>(); + continue; + } const PixelWeight* pWeights = weight_table_.GetPixelWeight(col); pdfium::span weights = pWeights->GetWeights(); // One validated view of exactly the source bytes this column taps. @@ -392,6 +605,7 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { break; } dest_span[dest_span_index++] = PixelFromFixed(dest_a); + ++col; } break; } @@ -442,12 +656,26 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { auto stretch_row_from = [this, &dest_span](auto src_pixels) { // The destination pixels have the same layout as the source // pixels: 3 bytes fully written, or 4 bytes of which the 4th is - // left untouched. + // left untouched (both here and on the generic path below). using DestPixel = std::remove_const_t; auto dest_pixels = fxcrt::reinterpret_span(dest_span); + pdfium::span runs(horz_runs_); size_t dest_index = 0; - for (int col = dest_clip_.left; col < dest_clip_.right; ++col) { + for (int col = dest_clip_.left; col < dest_clip_.right;) { + if (!runs.empty() && runs.front().dest_col == col) { + // See the matching kernel in the k8BppTo8Bpp case above: one + // gather and multiply-accumulate per tap for all 4 columns of + // each group in the run, reading the same weights and source + // pixels, in the same tap order, as the per-column path below. + const StretchHorzRun& run = runs.front(); + StretchHorzRunSimd(HorzRunGroups(run), src_pixels, + dest_pixels.subspan(dest_index)); + dest_index += 4 * run.group_count; + col += 4 * run.group_count; + runs = runs.subspan<1u>(); + continue; + } const PixelWeight* pWeights = weight_table_.GetPixelWeight(col); pdfium::span weights = pWeights->GetWeights(); auto window = @@ -487,6 +715,7 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { dest.blue = PixelFromFixed(dest_b); dest.green = PixelFromFixed(dest_g); dest.red = PixelFromFixed(dest_r); + ++col; } }; if (Bpp == 3) { @@ -512,8 +741,22 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { src_row_span); auto dest_pixels = fxcrt::reinterpret_span>(dest_span); + pdfium::span runs(horz_runs_); size_t dest_index = 0; - for (int col = dest_clip_.left; col < dest_clip_.right; ++col) { + for (int col = dest_clip_.left; col < dest_clip_.right;) { + if (!runs.empty() && runs.front().dest_col == col) { + // See the matching kernels above: one gather and + // multiply-accumulate per tap for all 4 columns of each group in + // the run, including the per-lane weight*alpha/255 divide the + // per-column path below performs, in the same tap order. + const StretchHorzRun& run = runs.front(); + StretchHorzRunAlphaSimd(HorzRunGroups(run), src_pixels, + dest_pixels.subspan(dest_index)); + dest_index += 4 * run.group_count; + col += 4 * run.group_count; + runs = runs.subspan<1u>(); + continue; + } const PixelWeight* pWeights = weight_table_.GetPixelWeight(col); pdfium::span weights = pWeights->GetWeights(); auto window = @@ -562,6 +805,7 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { dest.green = PixelFromFixed(dest_g); dest.red = PixelFromFixed(dest_r); dest.alpha = PixelFromFixed(255 * dest_a); + ++col; } break; } diff --git a/core/fxge/dib/cstretchengine.h b/core/fxge/dib/cstretchengine.h index 9ef9afb101..b75c5a5edc 100644 --- a/core/fxge/dib/cstretchengine.h +++ b/core/fxge/dib/cstretchengine.h @@ -7,12 +7,17 @@ #ifndef CORE_FXGE_DIB_CSTRETCHENGINE_H_ #define CORE_FXGE_DIB_CSTRETCHENGINE_H_ +#include #include +#include +#include + #include "core/fxcrt/check_op.h" #include "core/fxcrt/data_vector.h" #include "core/fxcrt/fixed_size_data_vector.h" #include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_memory_wrappers.h" #include "core/fxcrt/fx_system.h" #include "core/fxcrt/raw_span.h" #include "core/fxcrt/retain_ptr.h" @@ -23,6 +28,41 @@ class CFX_DIBBase; class PauseIndicatorIface; class ScanlineComposerIface; +// The horizontal stretch pass's k8BppTo8Bpp and kManyBpptoManyBpp arms (the +// former also serving 1bpp sources, whose rows are expanded to bytes) visit +// every destination column once per source row, and the modal tap counts are +// 1 (no scaling in this axis) and 2 (bilinear interpolation). Four columns +// sharing a tap count, in a long enough run of them, can be resampled in one +// pass with a vectorized gather-and-multiply-accumulate: see +// StretchHorzRunSimd() in cstretchengine_hwy.cpp. PlanHorzGroups() finds those +// runs and, for each whole group of four within one whose combined source +// window fits the gather (at most 32 bytes), precomputes the indices and +// weights the kernel needs. Columns not covered by a group -- an odd tap +// count, a short run, or a group whose window does not fit -- take the +// unchanged per-column path. +struct StretchHorzGroup { + size_t src_byte_base; // Byte offset of the source window in the row. + // Per-tap gather indices into the window; see the kernel. + std::array, 2> idx; + // Per-tap, per-column weights. + std::array, 2> weights; + uint32_t taps; // 1 or 2. + bool wide; // Whether the source window needs 32 bytes, not 16. +}; +FX_DATA_PARTITION_EXCEPTION(StretchHorzGroup); + +// A run of consecutive groups covering 4 * group_count consecutive +// destination columns from dest_col (an absolute column index, the same +// coordinate space ContinueStretchHorz()'s `col` uses): the groups at +// [first_group, first_group + group_count) of horz_groups_. The kernel +// handles a whole run per call. +struct StretchHorzRun { + int dest_col; + size_t first_group; + size_t group_count; +}; +FX_DATA_PARTITION_EXCEPTION(StretchHorzRun); + class CStretchEngine { public: static constexpr uint32_t kFixedPointBits = 16; @@ -159,6 +199,28 @@ class CStretchEngine { pdfium::span Expand1BppRow( pdfium::span src_row); + // What PlanHorzGroups() derives once per stretch for its helpers: the + // source pixel stride the gather reads, how many leading bytes of each + // pixel it loads, and the byte length of the row the kernel will read. + struct HorzPlanParams { + uint32_t bpp; + uint32_t gathered; + size_t src_row_bytes; + }; + + // Fills horz_groups_ and horz_runs_ for the current weight table; see + // StretchHorzGroup. + void PlanHorzGroups(); + void PlanHorzSpan(int start, + int end, + uint32_t taps, + const HorzPlanParams& params); + std::optional + BuildHorzGroup(int col, uint32_t taps, const HorzPlanParams& params) const; + uint32_t HorzTapCountAt(int col) const; + pdfium::span HorzRunGroups( + const StretchHorzRun& run) const; + const FXDIB_Format dest_format_; const int dest_bpp_; const int src_bpp_; @@ -182,6 +244,8 @@ class CStretchEngine { State state_ = State::kInitial; int cur_row_ = 0; WeightTable weight_table_; + DataVector horz_groups_; + DataVector horz_runs_; }; #endif // CORE_FXGE_DIB_CSTRETCHENGINE_H_ diff --git a/core/fxge/dib/cstretchengine_hwy.cpp b/core/fxge/dib/cstretchengine_hwy.cpp new file mode 100644 index 0000000000..064c618fbf --- /dev/null +++ b/core/fxge/dib/cstretchengine_hwy.cpp @@ -0,0 +1,425 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxge/dib/cstretchengine_hwy.h" + +#include +#include + +#include + +#include "core/fxcrt/compiler_specific.h" +#include "core/fxcrt/notreached.h" +#include "core/fxcrt/span.h" +#include "core/fxcrt/span_util.h" + +#undef HWY_TARGET_INCLUDE +#define HWY_TARGET_INCLUDE "core/fxge/dib/cstretchengine_hwy.cpp" +#include "third_party/highway/src/hwy/foreach_target.h" // IWYU pragma: keep +#include "third_party/highway/src/hwy/highway.h" + +HWY_BEFORE_NAMESPACE(); +namespace fxge_stretch_simd { +namespace HWY_NAMESPACE { +namespace { + +namespace hn = hwy::HWY_NAMESPACE; + +// HWY_SCALAR has no vector wide enough for Full128: Highway's portable +// fallback for targets without real SIMD is HWY_EMU128 (which does support +// it), and HWY_SCALAR is only selected instead when an embedder defines +// HWY_COMPILE_ONLY_SCALAR, or when HWY_EMU128 itself is broken for their +// compiler. Either way, PlanHorzGroups() (cstretchengine.cpp) checks +// StretchHorzSimdAvailable() and never plans a group in that build, so +// ContinueStretchHorz() never calls these. +#if HWY_TARGET == HWY_SCALAR + +void RunBpp1(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest) { + NOTREACHED(); +} +void RunBpp3(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest) { + NOTREACHED(); +} +void RunBpp4(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest) { + NOTREACHED(); +} +void RunAlpha(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest) { + NOTREACHED(); +} + +#else // HWY_TARGET == HWY_SCALAR + +using D8 = hn::Full128; +using D32 = hn::Full128; + +// Runs `do_group` over every group in `groups`, each writing the next +// kDestBytes of `dest`. Keeping this loop here, rather than dispatching once +// per group from ContinueStretchHorz(), makes the runtime target selection +// and the call a per-run cost instead of a per-4-columns one: a full-width +// run of an unclipped bilinear row is hundreds of groups. +template +inline void DoRun(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest, + DoGroupFn do_group) { + for (const StretchHorzGroup& group : groups) { + do_group(group, src_row, dest.template first()); + dest = dest.subspan(kDestBytes); + } +} + +// Gathers one tap's four columns' worth of source bytes into 32-bit lanes, +// zero-extended, per the group's precomputed index plan. `window` is the +// group's 16 or 32 source bytes; `idx` is 16 lane indices into it, where +// unused lanes are the 0xFF sentinel PlanHorzGroups() fills, which must read +// back as zero. +// +// For the narrow (16-byte window) case a single TableLookupBytesOr0() does +// this directly: valid indices are in [0, 16), the sentinel is 0xFF (bit 7 +// set), and Or0's contract guarantees zero exactly there. +// +// For the wide (32-byte, two 16-byte table halves) case, Highway's portable +// contract only guarantees a zero when the index's bit 7 is set; indices in +// [16, 128) are implementation-defined. So the low-table lookup needs its +// indices explicitly masked to either the true value (< 16) or 0x80. The +// high-table lookup does not: `idx - 16` wraps every index outside [16, 32) +// -- values below 16, and the 0xFF sentinel -- into [0x80, 0xFF], which is +// already Or0-safe, while valid indices in [16, 32) land correctly in +// [0, 16). +template +inline hn::Vec Gather(D8 d8, + pdfium::span window, + const std::array& idx) { + const auto raw_idx = hn::LoadU(d8, idx.data()); + if constexpr (kWide) { + const auto table_lo = hn::LoadU(d8, window.template first<16>().data()); + const auto table_hi = + hn::LoadU(d8, window.template subspan<16, 16>().data()); + const auto idx_lo = hn::IfThenElse(hn::Lt(raw_idx, hn::Set(d8, 16)), + raw_idx, hn::Set(d8, 0x80)); + const auto idx_hi = hn::Sub(raw_idx, hn::Set(d8, 16)); + return hn::Or(hn::TableLookupBytesOr0(table_lo, idx_lo), + hn::TableLookupBytesOr0(table_hi, idx_hi)); + } + const auto table = hn::LoadU(d8, window.data()); + return hn::TableLookupBytesOr0(table, raw_idx); +} + +// The group's source window within the row: 16 or 32 bytes from +// src_byte_base, which PlanHorzGroups() keeps inside the row. A fixed-extent +// span, so the loads within it need no further bounds checks. +template +inline pdfium::span Window( + const StretchHorzGroup& group, + pdfium::span src_row) { + return src_row.subspan(group.src_byte_base).template first(); +} + +// Exactly the scalar arithmetic the per-column path performs: gather, +// multiply by the tap weight, accumulate across taps in uint32 with +// wraparound, then (acc >> 16) & 0xFF is CStretchEngine::PixelFromFixed(). +// `dest` is the group's 4 destination pixels, 4 * kBpp bytes. +template +inline void DoGroupImpl(const StretchHorzGroup& group, + pdfium::span src_row, + pdfium::span dest) { + const D8 d8; + const D32 d32; + const auto window = Window(group, src_row); + + const auto p0 = hn::BitCast(d32, Gather(d8, window, group.idx[0])); + const auto w0 = hn::LoadU(d32, group.weights[0].data()); + const auto m255 = hn::Set(d32, 0xFF); + + hn::Vec b{}; + hn::Vec g{}; + hn::Vec r{}; + if constexpr (kBpp == 1) { + b = hn::Mul(p0, w0); + } else { + b = hn::Mul(hn::And(p0, m255), w0); + g = hn::Mul(hn::And(hn::ShiftRight<8>(p0), m255), w0); + r = hn::Mul(hn::ShiftRight<16>(p0), w0); + } + + if constexpr (kTaps == 2) { + const auto p1 = hn::BitCast(d32, Gather(d8, window, group.idx[1])); + const auto w1 = hn::LoadU(d32, group.weights[1].data()); + if constexpr (kBpp == 1) { + b = hn::Add(b, hn::Mul(p1, w1)); + } else { + b = hn::Add(b, hn::Mul(hn::And(p1, m255), w1)); + g = hn::Add(g, hn::Mul(hn::And(hn::ShiftRight<8>(p1), m255), w1)); + r = hn::Add(r, hn::Mul(hn::ShiftRight<16>(p1), w1)); + } + } + + // (acc >> 16) & 0xFF is PixelFromFixed(); the mask also satisfies + // U8FromU32()'s precondition that lanes are already in [0, 256). + const auto b16 = hn::And(hn::ShiftRight<16>(b), m255); + + // A single if-constexpr/else chain: code after an early return inside one + // arm of `if constexpr` is still instantiated for every kBpp, so the + // kBpp == 4 arm's static_assert would otherwise fire for kBpp == 1 too. + if constexpr (kBpp == 1) { + const hn::Full32 d8x4; + hn::StoreU(hn::U8FromU32(b16), d8x4, dest.data()); + } else { + const auto g16 = hn::And(hn::ShiftRight<16>(g), m255); + const auto r16 = hn::And(hn::ShiftRight<16>(r), m255); + // Each 32-bit lane becomes one column's B | G << 8 | R << 16, which in + // memory is the destination's B, G, R byte order -- the same + // little-endian lane layout the gather's BitCast to 32-bit lanes above + // already relies on for splitting the channels out. + const auto bgr = + hn::Or(hn::Or(b16, hn::ShiftLeft<8>(g16)), hn::ShiftLeft<16>(r16)); + if constexpr (kBpp == 3) { + // Drop each lane's zero 4th byte: the 4 columns' 12 payload bytes end + // up in the vector's first 12 bytes, stored as 8 + 4 so that nothing is + // written past the 12 bytes the group owns. + static constexpr std::array kPack = { + 0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 0x80, 0x80, 0x80, 0x80}; + const auto packed = hn::TableLookupBytesOr0(hn::BitCast(d8, bgr), + hn::LoadU(d8, kPack.data())); + const hn::Half d8x8; + hn::StoreU(hn::LowerHalf(d8x8, packed), d8x8, dest.data()); + const uint32_t tail = hn::ExtractLane(hn::BitCast(d32, packed), 2); + fxcrt::spancpy(dest.template subspan<8, 4>(), + pdfium::byte_span_from_ref(tail)); + } else { + static_assert(kBpp == 4); + // Byte 3 (alpha/padding) is left untouched, matching the per-column + // path: the 16 bytes are written back with their current 4th bytes. + const auto old = hn::BitCast(d32, hn::LoadU(d8, dest.data())); + const auto out = hn::Or(hn::And(old, hn::Set(d32, 0xFF000000u)), bgr); + hn::StoreU(hn::BitCast(d8, out), d8, dest.data()); + } + } +} + +// Chooses among the 4 (taps, wide) instantiations of DoGroupImpl +// once per group of 4 columns -- not once per column, so this one small +// branch is negligible next to the gather and multiply-accumulate it +// selects. +template +inline void DoGroup(const StretchHorzGroup& group, + pdfium::span src_row, + pdfium::span dest) { + if (group.taps == 1) { + if (group.wide) { + DoGroupImpl(group, src_row, dest); + } else { + DoGroupImpl(group, src_row, dest); + } + } else { + if (group.wide) { + DoGroupImpl(group, src_row, dest); + } else { + DoGroupImpl(group, src_row, dest); + } + } +} + +// Same shape as DoGroupImpl(), for the alpha arm: source and destination are +// always 4-byte BGRA, and each tap's contribution is weighted by +// `weight * src.alpha / 255`, not just `weight` -- a per-lane divide that +// depends on the gathered source alpha, so it can't be folded into the +// precomputed per-tap weight the non-alpha kernel uses. `weight * alpha` +// reaches 65536 * 255, so the usual `(x + 1 + (x >> 8)) >> 8` approximation +// (exact only up to 65535) is wrong here; instead this is the exact +// reciprocal-multiply trick for unsigned division by 255, matching the +// scalar path's `weight * src.alpha / 255` bit for bit: `(x * 0x80808081) >> +// 39` equals `x / 255` for every uint32_t `x`, including this kernel's full +// range (verified exhaustively over [0, 65536 * 255]), and `MulHigh` + +// `ShiftRight<7>` compute exactly that -- the top 32 bits of the 64-bit +// product, then the remaining 7 of the 39 shift -- without `Div`'s +// float-conversion round trip. +template +inline void DoGroupAlphaImpl(const StretchHorzGroup& group, + pdfium::span src_row, + pdfium::span dest) { + const D8 d8; + const D32 d32; + const auto window = Window(group, src_row); + const auto m255 = hn::Set(d32, 0xFF); + const auto kMul255Recip = hn::Set(d32, 0x80808081u); + + const auto p0 = hn::BitCast(d32, Gather(d8, window, group.idx[0])); + const auto w0 = hn::LoadU(d32, group.weights[0].data()); + const auto alpha0 = hn::ShiftRight<24>(p0); + const auto pw0 = + hn::ShiftRight<7>(hn::MulHigh(hn::Mul(w0, alpha0), kMul255Recip)); + auto b = hn::Mul(pw0, hn::And(p0, m255)); + auto g = hn::Mul(pw0, hn::And(hn::ShiftRight<8>(p0), m255)); + auto r = hn::Mul(pw0, hn::And(hn::ShiftRight<16>(p0), m255)); + auto a = pw0; + + if constexpr (kTaps == 2) { + const auto p1 = hn::BitCast(d32, Gather(d8, window, group.idx[1])); + const auto w1 = hn::LoadU(d32, group.weights[1].data()); + const auto alpha1 = hn::ShiftRight<24>(p1); + const auto pw1 = + hn::ShiftRight<7>(hn::MulHigh(hn::Mul(w1, alpha1), kMul255Recip)); + b = hn::Add(b, hn::Mul(pw1, hn::And(p1, m255))); + g = hn::Add(g, hn::Mul(pw1, hn::And(hn::ShiftRight<8>(p1), m255))); + r = hn::Add(r, hn::Mul(pw1, hn::And(hn::ShiftRight<16>(p1), m255))); + a = hn::Add(a, pw1); + } + + // Matches the scalar path: blue/green/red are PixelFromFixed() of the + // accumulated `pixel_weight * channel`; alpha is PixelFromFixed() of + // `255 * accumulated pixel_weight` (the earlier /255 divides are folded + // back out here, the same as the per-column loop does). + // Each 32-bit lane becomes one column's B | G << 8 | R << 16 | A << 24, + // the destination's BGRA byte order in memory (little-endian lanes, as the + // gather's BitCast above already assumes), so the 4 columns are one + // 16-byte store. + const auto b16 = hn::And(hn::ShiftRight<16>(b), m255); + const auto g16 = hn::And(hn::ShiftRight<16>(g), m255); + const auto r16 = hn::And(hn::ShiftRight<16>(r), m255); + const auto a16 = hn::And(hn::ShiftRight<16>(hn::Mul(a, m255)), m255); + const auto bgra = + hn::Or(hn::Or(b16, hn::ShiftLeft<8>(g16)), + hn::Or(hn::ShiftLeft<16>(r16), hn::ShiftLeft<24>(a16))); + hn::StoreU(hn::BitCast(d8, bgra), d8, dest.data()); +} + +inline void DoGroupAlpha(const StretchHorzGroup& group, + pdfium::span src_row, + pdfium::span dest) { + if (group.taps == 1) { + if (group.wide) { + DoGroupAlphaImpl<1, true>(group, src_row, dest); + } else { + DoGroupAlphaImpl<1, false>(group, src_row, dest); + } + } else { + if (group.wide) { + DoGroupAlphaImpl<2, true>(group, src_row, dest); + } else { + DoGroupAlphaImpl<2, false>(group, src_row, dest); + } + } +} + +void RunBpp1(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest) { + DoRun<4>(groups, src_row, dest, DoGroup<1>); +} +void RunBpp3(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest) { + DoRun<12>(groups, src_row, dest, DoGroup<3>); +} +void RunBpp4(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest) { + DoRun<16>(groups, src_row, dest, DoGroup<4>); +} +void RunAlpha(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest) { + DoRun<16>(groups, src_row, dest, DoGroupAlpha); +} + +#endif // HWY_TARGET == HWY_SCALAR + +} // namespace +} // namespace HWY_NAMESPACE +} // namespace fxge_stretch_simd +HWY_AFTER_NAMESPACE(); + +#if HWY_ONCE +namespace fxge_stretch_simd { + +HWY_EXPORT(RunBpp1); +HWY_EXPORT(RunBpp3); +HWY_EXPORT(RunBpp4); +HWY_EXPORT(RunAlpha); + +// Called unqualified, from inside this namespace: when only one target is +// compiled (e.g. HWY_SCALAR), HWY_DYNAMIC_DISPATCH()/HWY_EXPORT() collapse to +// a direct call to HWY_STATIC_NAMESPACE::FUNC_NAME, which only resolves if +// FUNC_NAME is looked up from inside the enclosing project namespace, as +// Highway's own usage example does -- not from the StretchHorz*Simd() free +// functions below, which callers reach without naming this namespace. +void CallRunBpp1(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest_row) { + // SAFETY: indexes Highway's per-target function table with the index of + // the target Highway itself chose for this CPU, which it keeps within + // that table; there is no span form of the macro. + UNSAFE_BUFFERS(HWY_DYNAMIC_DISPATCH(RunBpp1)(groups, src_row, dest_row)); +} +void CallRunBpp3(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest_row) { + // SAFETY: indexes Highway's per-target function table with the index of + // the target Highway itself chose for this CPU, which it keeps within + // that table; there is no span form of the macro. + UNSAFE_BUFFERS(HWY_DYNAMIC_DISPATCH(RunBpp3)(groups, src_row, dest_row)); +} +void CallRunBpp4(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest_row) { + // SAFETY: indexes Highway's per-target function table with the index of + // the target Highway itself chose for this CPU, which it keeps within + // that table; there is no span form of the macro. + UNSAFE_BUFFERS(HWY_DYNAMIC_DISPATCH(RunBpp4)(groups, src_row, dest_row)); +} +void CallRunAlpha(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest_row) { + // SAFETY: indexes Highway's per-target function table with the index of + // the target Highway itself chose for this CPU, which it keeps within + // that table; there is no span form of the macro. + UNSAFE_BUFFERS(HWY_DYNAMIC_DISPATCH(RunAlpha)(groups, src_row, dest_row)); +} + +} // namespace fxge_stretch_simd + +void StretchHorzRunSimd(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest_row) { + fxge_stretch_simd::CallRunBpp1(groups, src_row, dest_row); +} + +void StretchHorzRunSimd(pdfium::span groups, + pdfium::span> src_row, + pdfium::span> dest_row) { + fxge_stretch_simd::CallRunBpp3( + groups, fxcrt::reinterpret_span(src_row), + fxcrt::reinterpret_span(dest_row)); +} + +void StretchHorzRunSimd(pdfium::span groups, + pdfium::span> src_row, + pdfium::span> dest_row) { + fxge_stretch_simd::CallRunBpp4( + groups, fxcrt::reinterpret_span(src_row), + fxcrt::reinterpret_span(dest_row)); +} + +void StretchHorzRunAlphaSimd( + pdfium::span groups, + pdfium::span> src_row, + pdfium::span> dest_row) { + fxge_stretch_simd::CallRunAlpha( + groups, fxcrt::reinterpret_span(src_row), + fxcrt::reinterpret_span(dest_row)); +} + +bool StretchHorzSimdAvailable() { + return (HWY_TARGETS & HWY_SCALAR) == 0; +} +#endif // HWY_ONCE diff --git a/core/fxge/dib/cstretchengine_hwy.h b/core/fxge/dib/cstretchengine_hwy.h new file mode 100644 index 0000000000..9ef8d20340 --- /dev/null +++ b/core/fxge/dib/cstretchengine_hwy.h @@ -0,0 +1,59 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CORE_FXGE_DIB_CSTRETCHENGINE_HWY_H_ +#define CORE_FXGE_DIB_CSTRETCHENGINE_HWY_H_ + +#include + +#include "core/fxcrt/span.h" +#include "core/fxge/dib/cstretchengine.h" +#include "core/fxge/dib/fx_dib.h" + +// Resamples a run of groups' destination columns, 4 per group, in one call: +// for each group, exactly the scalar arithmetic the per-column path performs +// for the same columns (see PlanHorzGroups() and the callers in +// ContinueStretchHorz()): gather each tap's source bytes from `src_row` via +// the group's precomputed index plan, multiply by the tap weight, accumulate +// across taps in the same order, and write one destination pixel per column. +// +// Every group in `groups` is processed, in order, each writing the next 4 +// pixels of `dest_row`, so `dest_row` must hold at least 4 pixels per group. +// PlanHorzGroups() built `groups` for `src_row`, and guarantees each group's +// source window lies within it. +// +// Three destination pixel types, matching the arms of ContinueStretchHorz(): +// a byte (k8BppTo8Bpp, including expanded 1bpp rows), FX_BGR_STRUCT +// (kManyBpptoManyBpp to kBgr) and FX_BGRA_STRUCT (kManyBpptoManyBpp to +// kBgrx, whose 4th byte is left untouched, as the per-column path does). +// +// Implemented with Highway (see cstretchengine_hwy.cpp). `group.taps` and +// `group.wide` select among 4 internal code paths once per group of 4 +// columns, not once per column. +void StretchHorzRunSimd(pdfium::span groups, + pdfium::span src_row, + pdfium::span dest_row); +void StretchHorzRunSimd(pdfium::span groups, + pdfium::span> src_row, + pdfium::span> dest_row); +void StretchHorzRunSimd(pdfium::span groups, + pdfium::span> src_row, + pdfium::span> dest_row); + +// Same contract, for kManyBpptoManyBppWithAlpha: source and destination are +// BGRA, and each tap's contribution is `weight * src.alpha / 255`, not just +// `weight`, so this isn't one of the overloads above -- it has its own kernel +// (cstretchengine_hwy.cpp) that computes that per-lane divide, and it writes +// all 4 bytes of each destination pixel. +void StretchHorzRunAlphaSimd( + pdfium::span groups, + pdfium::span> src_row, + pdfium::span> dest_row); + +// False if this build has no vectorized kernel to dispatch to (HWY_SCALAR, +// see cstretchengine_hwy.cpp), in which case PlanHorzGroups() should not +// plan any groups: there would be nothing able to process them. +bool StretchHorzSimdAvailable(); + +#endif // CORE_FXGE_DIB_CSTRETCHENGINE_HWY_H_ diff --git a/core/fxge/dib/cstretchengine_unittest.cpp b/core/fxge/dib/cstretchengine_unittest.cpp index baecc52705..64f33431fc 100644 --- a/core/fxge/dib/cstretchengine_unittest.cpp +++ b/core/fxge/dib/cstretchengine_unittest.cpp @@ -5,6 +5,7 @@ #include "core/fxge/dib/cstretchengine.h" #include +#include #include #include #include @@ -14,7 +15,10 @@ #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fxcrt/containers/to_vector.h" +#include "core/fxcrt/span.h" +#include "core/fxcrt/span_util.h" #include "core/fxge/dib/cfx_dibitmap.h" +#include "core/fxge/dib/cstretchengine_hwy.h" #include "core/fxge/dib/fx_dib.h" #include "core/fxge/dib/scanlinecomposer_iface.h" #include "testing/gtest/include/gtest/gtest.h" @@ -277,3 +281,250 @@ TEST(CStretchEngine, TooManyWeights) { kTooBigSrcLen, 0, kTooBigSrcLen, options)); } + +namespace { + +// What one group of StretchHorzRunSimd() is documented to compute (see the +// comment above StretchHorzGroup), re-derived in plain scalar code rather +// than copied from the kernel: per column and channel, gather each tap's byte +// through the group's index plan (a 0xFF index reads as zero), multiply by +// the tap's weight, accumulate in uint32 with wraparound, take bits 16..23. +void ScalarGroupReference(int bpp, + const StretchHorzGroup& group, + pdfium::span src_row, + std::array, 4>& expected) { + const int gathered = bpp == 1 ? 1 : 3; + for (int k = 0; k < 4; ++k) { + for (int c = 0; c < gathered; ++c) { + uint32_t acc = 0; + for (uint32_t t = 0; t < group.taps; ++t) { + const uint8_t idx = group.idx[t][k * 4 + c]; + const uint8_t byte_val = + idx == 0xFF ? 0 : src_row[group.src_byte_base + idx]; + acc += group.weights[t][k] * byte_val; + } + expected[k][c] = CStretchEngine::PixelFromFixed(acc); + } + } +} + +// Weights spanning the 17-bit fixed-point range the weight table produces: +// zero, one, the midpoint, and both ends. +constexpr std::array kTestWeights = {0, 1, 32768, 65535, 65536}; + +// Source bytes spanning uint8_t's range, plus two values that are not a +// power of two. +constexpr std::array kTestBytes = {0, 1, 84, 127, + 128, 171, 254, 255}; + +// Builds the `seed`-th of a small, fixed set of test groups with `taps` taps +// over a `wide` (32 byte) or narrow (16 byte) window at the start of the +// row: every (column, tap) gathers `gathered` consecutive bytes from a +// position and a weight chosen from kTestWeights, cycling both with a +// different phase per (column, tap) so consecutive seeds exercise different +// combinations -- deliberately, rather than hoping random search eventually +// covers the same positions and weights. +StretchHorzGroup BuildTestGroup(int seed, int gathered, uint32_t taps, bool wide) { + const int load_bytes = wide ? 32 : 16; + const int max_pos = load_bytes - gathered; + const std::array positions = {0, max_pos / 2, max_pos}; + StretchHorzGroup group = {}; + group.taps = taps; + group.wide = wide; + std::ranges::fill(group.idx[0], 0xFF); + std::ranges::fill(group.idx[1], 0xFF); + int n = seed; + for (int k = 0; k < 4; ++k) { + for (uint32_t t = 0; t < taps; ++t) { + const int pos = positions[n % positions.size()]; + for (int c = 0; c < gathered; ++c) { + group.idx[t][k * 4 + c] = static_cast(pos + c); + } + group.weights[t][k] = kTestWeights[n % kTestWeights.size()]; + ++n; + } + } + return group; +} + +// How many of BuildTestGroup()'s seeds to check: enough that, since +// kTestWeights and the 3 positions are coprime in count, every (position, +// weight) pair is reached at least once, shifted by a different phase per +// seed. +constexpr int kTestSeedCount = 16; + +// A source row of 48 bytes cycling through kTestBytes (whole BGR and BGRA +// pixels) and a 24-byte destination prefilled with 0xAA, so untouched bytes +// can be told apart. +struct KernelBuffers { + std::array src_row; + std::array dest; + + KernelBuffers() { + for (size_t i = 0; i < src_row.size(); ++i) { + src_row[i] = kTestBytes[i % kTestBytes.size()]; + } + std::ranges::fill(dest, 0xAA); + } +}; + +// Runs one group through the kernel for the destination pixel type `Pixel` +// (a byte, FX_BGR_STRUCT or FX_BGRA_STRUCT). +template +void RunOneGroup(const StretchHorzGroup& group, KernelBuffers& buffers) { + StretchHorzRunSimd( + pdfium::span_from_ref(group), + fxcrt::reinterpret_span( + pdfium::span(buffers.src_row)), + fxcrt::reinterpret_span(pdfium::span(buffers.dest))); +} + +template +void CheckTestGroups(uint32_t taps, bool wide) { + const int gathered = kBpp == 1 ? 1 : 3; + for (int seed = 0; seed < kTestSeedCount; ++seed) { + KernelBuffers buffers; + const StretchHorzGroup group = BuildTestGroup(seed, gathered, taps, wide); + std::array, 4> expected = {}; + ScalarGroupReference(kBpp, group, buffers.src_row, expected); + + RunOneGroup(group, buffers); + for (int k = 0; k < 4; ++k) { + for (int c = 0; c < gathered; ++c) { + EXPECT_EQ(expected[k][c], buffers.dest[k * kBpp + c]) + << "seed " << seed << " column " << k << " channel " << c; + } + if constexpr (kBpp == 4) { + EXPECT_EQ(0xAA, buffers.dest[k * 4 + 3]) + << "seed " << seed << " column " << k; + } + } + // The 4 columns of kBpp bytes are all the group may write. + for (size_t i = 4 * kBpp; i < buffers.dest.size(); ++i) { + EXPECT_EQ(0xAA, buffers.dest[i]) << "seed " << seed << " byte " << i; + } + } +} + +// The alpha arm's per-column arithmetic (kManyBpptoManyBppWithAlpha in +// ContinueStretchHorz()), re-derived: each tap contributes weight * +// src.alpha / 255 (truncating) times the channel, the alpha channel +// accumulates that pixel weight itself, and the output alpha is bits 16..23 +// of 255 times the accumulated pixel weight. +void ScalarAlphaReference(const StretchHorzGroup& group, + pdfium::span src_row, + std::array, 4>& expected) { + for (int k = 0; k < 4; ++k) { + std::array acc = {}; + for (uint32_t t = 0; t < group.taps; ++t) { + std::array px; + for (int c = 0; c < 4; ++c) { + const uint8_t idx = group.idx[t][k * 4 + c]; + px[c] = idx == 0xFF ? 0 : src_row[group.src_byte_base + idx]; + } + const uint32_t pixel_weight = group.weights[t][k] * px[3] / 255; + for (int c = 0; c < 3; ++c) { + acc[c] += pixel_weight * px[c]; + } + acc[3] += pixel_weight; + } + for (int c = 0; c < 3; ++c) { + expected[k][c] = CStretchEngine::PixelFromFixed(acc[c]); + } + expected[k][3] = CStretchEngine::PixelFromFixed(255 * acc[3]); + } +} + +void CheckTestAlphaGroups(uint32_t taps, bool wide) { + for (int seed = 0; seed < kTestSeedCount; ++seed) { + KernelBuffers buffers; + // A 4-byte gather per column: the alpha arm reads all of B, G, R, A. + const StretchHorzGroup group = BuildTestGroup(seed, 4, taps, wide); + std::array, 4> expected = {}; + ScalarAlphaReference(group, buffers.src_row, expected); + + using Pixel = FX_BGRA_STRUCT; + StretchHorzRunAlphaSimd( + pdfium::span_from_ref(group), + fxcrt::reinterpret_span( + pdfium::span(buffers.src_row)), + fxcrt::reinterpret_span(pdfium::span(buffers.dest))); + for (int k = 0; k < 4; ++k) { + for (int c = 0; c < 4; ++c) { + EXPECT_EQ(expected[k][c], buffers.dest[k * 4 + c]) + << "seed " << seed << " column " << k << " channel " << c; + } + } + for (size_t i = 16; i < buffers.dest.size(); ++i) { + EXPECT_EQ(0xAA, buffers.dest[i]) << "seed " << seed << " byte " << i; + } + } +} + +} // namespace + +TEST(CStretchEngine, HorzRunSimdMatchesScalarReference) { + if (!StretchHorzSimdAvailable()) { + GTEST_SKIP(); + } + for (uint32_t taps : {1u, 2u}) { + for (bool wide : {false, true}) { + CheckTestGroups<1, uint8_t>(taps, wide); + CheckTestGroups<3, FX_BGR_STRUCT>(taps, wide); + CheckTestGroups<4, FX_BGRA_STRUCT>(taps, wide); + } + } +} + +TEST(CStretchEngine, HorzRunAlphaSimdMatchesScalarReference) { + if (!StretchHorzSimdAvailable()) { + GTEST_SKIP(); + } + for (uint32_t taps : {1u, 2u}) { + for (bool wide : {false, true}) { + CheckTestAlphaGroups(taps, wide); + } + } +} + +// The run contract: every group in the span is processed, in order, each +// writing the next 4 destination pixels, and nothing beyond them. Every +// group here is one identity tap (weight 65536) over bytes 0..11 of the row, +// so each group's output must equal the row's first 12 bytes. +TEST(CStretchEngine, HorzRunSimdProcessesEveryGroup) { + if (!StretchHorzSimdAvailable()) { + GTEST_SKIP(); + } + std::array src_row; + for (size_t i = 0; i < src_row.size(); ++i) { + src_row[i] = static_cast(0x10 + i); + } + std::array groups = {}; + for (StretchHorzGroup& group : groups) { + group.taps = 1; + std::ranges::fill(group.idx[0], 0xFF); + std::ranges::fill(group.idx[1], 0xFF); + for (int k = 0; k < 4; ++k) { + for (int c = 0; c < 3; ++c) { + group.idx[0][k * 4 + c] = static_cast(k * 3 + c); + } + group.weights[0][k] = CStretchEngine::kFixedPointOne; + } + } + std::array dest; + std::ranges::fill(dest, 0xAA); + using Pixel = FX_BGR_STRUCT; + StretchHorzRunSimd(groups, + fxcrt::reinterpret_span( + pdfium::span(src_row)), + fxcrt::reinterpret_span(pdfium::span(dest))); + const pdfium::span dest_span(dest); + const pdfium::span row_span(src_row); + for (size_t j = 0; j < groups.size(); ++j) { + EXPECT_EQ(row_span.first(12u), dest_span.subspan(12 * j, 12u)) + << "group " << j; + } + for (size_t i = 12 * groups.size(); i < dest.size(); ++i) { + EXPECT_EQ(0xAA, dest[i]) << "byte " << i; + } +} From 7c55203ed66b0461378323e3fcf2efaf76755241 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Thu, 15 Oct 2026 14:15:59 -0700 Subject: [PATCH 37/37] Use display list comparisons in form fill embedder tests Replace bitmap comparisons in FPDFFormFillEmbedderTest with DisplayListRenderer assertions. This verifies rendered form text and rectangle highlights directly against display list output instead of platform-specific rasterized bitmaps, eliminating 42 obsolete golden PNG files. Change-Id: I47a8f536bf267559b3a4f4cf5506bb90fc2b1b07 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/160351 Commit-Queue: Tom Sepez Reviewed-by: Lei Zhang --- fpdfsdk/fpdf_formfill_embeddertest.cpp | 78 ++++++------------ .../bug_1302455_edit_both_forms.dump.txt | 14 ++++ .../bug_1302455_edit_both_forms_agg.png | Bin 1632 -> 0 bytes .../bug_1302455_edit_both_forms_agg_mac.png | Bin 1197 -> 0 bytes ...bug_1302455_edit_both_forms_skia_linux.png | Bin 1063 -> 0 bytes .../bug_1302455_edit_both_forms_skia_mac.png | Bin 1051 -> 0 bytes .../bug_1302455_edit_both_forms_skia_win.png | Bin 982 -> 0 bytes .../bug_1302455_edit_first_form.dump.txt | 14 ++++ .../bug_1302455_edit_first_form_agg.png | Bin 1145 -> 0 bytes .../bug_1302455_edit_first_form_agg_mac.png | Bin 899 -> 0 bytes ...bug_1302455_edit_first_form_skia_linux.png | Bin 851 -> 0 bytes .../bug_1302455_edit_first_form_skia_mac.png | Bin 827 -> 0 bytes .../bug_1302455_edit_first_form_skia_win.png | Bin 766 -> 0 bytes .../bug_1302455_edit_second_form.dump.txt | 14 ++++ .../bug_1302455_edit_second_form_agg.png | Bin 1005 -> 0 bytes .../bug_1302455_edit_second_form_agg_mac.png | Bin 855 -> 0 bytes ...ug_1302455_edit_second_form_skia_linux.png | Bin 789 -> 0 bytes .../bug_1302455_edit_second_form_skia_mac.png | Bin 784 -> 0 bytes .../bug_1302455_edit_second_form_skia_win.png | Bin 762 -> 0 bytes .../bug_1302455_read_only.dump.txt | 14 ++++ .../bug_1302455_read_only_agg.png | Bin 149 -> 0 bytes .../bug_1302455_read_only_skia.png | Bin 162 -> 0 bytes .../embedder_tests/bug_535730401.dump.txt | 27 ++++++ .../embedder_tests/bug_535730401.png | Bin 3296 -> 0 bytes .../bug_535730401_combobox.dump.txt | 39 +++++++++ .../embedder_tests/bug_535730401_combobox.png | Bin 4108 -> 0 bytes .../bug_535730401_combobox_mac.png | Bin 3909 -> 0 bytes .../bug_535730401_combobox_skia_linux.png | Bin 3521 -> 0 bytes .../bug_535730401_combobox_skia_mac.png | Bin 2723 -> 0 bytes .../bug_535730401_combobox_skia_win.png | Bin 1709 -> 0 bytes .../embedder_tests/bug_535730401_mac.png | Bin 3098 -> 0 bytes .../bug_535730401_skia_linux.png | Bin 2651 -> 0 bytes .../embedder_tests/bug_535730401_skia_mac.png | Bin 2175 -> 0 bytes .../embedder_tests/bug_535730401_skia_win.png | Bin 1176 -> 0 bytes .../focused_text_form_with_abc.dump.txt | 14 ++++ .../focused_text_form_with_abc_agg.png | Bin 2131 -> 0 bytes .../focused_text_form_with_abc_agg_mac.png | Bin 1098 -> 0 bytes .../focused_text_form_with_abc_skia_linux.png | Bin 970 -> 0 bytes .../focused_text_form_with_abc_skia_mac.png | Bin 1046 -> 0 bytes .../focused_text_form_with_abc_skia_win.png | Bin 775 -> 0 bytes .../embedder_tests/text_form.dump.txt | 10 +++ .../text_form_no_highlight.dump.txt | 9 ++ .../text_form_no_highlight_agg.png | Bin 854 -> 0 bytes .../text_form_no_highlight_agg_mac.png | Bin 861 -> 0 bytes .../text_form_no_highlight_skia_linux.png | Bin 764 -> 0 bytes .../text_form_no_highlight_skia_mac.png | Bin 817 -> 0 bytes .../text_form_no_highlight_skia_win.png | Bin 456 -> 0 bytes .../unfocused_text_form_with_abc.dump.txt | 11 +++ .../unfocused_text_form_with_abc_agg.png | Bin 2162 -> 0 bytes .../unfocused_text_form_with_abc_agg_mac.png | Bin 1838 -> 0 bytes ...nfocused_text_form_with_abc_skia_linux.png | Bin 1521 -> 0 bytes .../unfocused_text_form_with_abc_skia_mac.png | Bin 1581 -> 0 bytes .../unfocused_text_form_with_abc_skia_win.png | Bin 841 -> 0 bytes 53 files changed, 193 insertions(+), 51 deletions(-) create mode 100644 testing/resources/embedder_tests/bug_1302455_edit_both_forms.dump.txt delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_both_forms_agg.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_both_forms_agg_mac.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_both_forms_skia_linux.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_both_forms_skia_mac.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_both_forms_skia_win.png create mode 100644 testing/resources/embedder_tests/bug_1302455_edit_first_form.dump.txt delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_first_form_agg.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_first_form_agg_mac.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_first_form_skia_linux.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_first_form_skia_mac.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_first_form_skia_win.png create mode 100644 testing/resources/embedder_tests/bug_1302455_edit_second_form.dump.txt delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_second_form_agg.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_second_form_agg_mac.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_second_form_skia_linux.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_second_form_skia_mac.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_edit_second_form_skia_win.png create mode 100644 testing/resources/embedder_tests/bug_1302455_read_only.dump.txt delete mode 100644 testing/resources/embedder_tests/bug_1302455_read_only_agg.png delete mode 100644 testing/resources/embedder_tests/bug_1302455_read_only_skia.png create mode 100644 testing/resources/embedder_tests/bug_535730401.dump.txt delete mode 100644 testing/resources/embedder_tests/bug_535730401.png create mode 100644 testing/resources/embedder_tests/bug_535730401_combobox.dump.txt delete mode 100644 testing/resources/embedder_tests/bug_535730401_combobox.png delete mode 100644 testing/resources/embedder_tests/bug_535730401_combobox_mac.png delete mode 100644 testing/resources/embedder_tests/bug_535730401_combobox_skia_linux.png delete mode 100644 testing/resources/embedder_tests/bug_535730401_combobox_skia_mac.png delete mode 100644 testing/resources/embedder_tests/bug_535730401_combobox_skia_win.png delete mode 100644 testing/resources/embedder_tests/bug_535730401_mac.png delete mode 100644 testing/resources/embedder_tests/bug_535730401_skia_linux.png delete mode 100644 testing/resources/embedder_tests/bug_535730401_skia_mac.png delete mode 100644 testing/resources/embedder_tests/bug_535730401_skia_win.png create mode 100644 testing/resources/embedder_tests/focused_text_form_with_abc.dump.txt delete mode 100644 testing/resources/embedder_tests/focused_text_form_with_abc_agg.png delete mode 100644 testing/resources/embedder_tests/focused_text_form_with_abc_agg_mac.png delete mode 100644 testing/resources/embedder_tests/focused_text_form_with_abc_skia_linux.png delete mode 100644 testing/resources/embedder_tests/focused_text_form_with_abc_skia_mac.png delete mode 100644 testing/resources/embedder_tests/focused_text_form_with_abc_skia_win.png create mode 100644 testing/resources/embedder_tests/text_form.dump.txt create mode 100644 testing/resources/embedder_tests/text_form_no_highlight.dump.txt delete mode 100644 testing/resources/embedder_tests/text_form_no_highlight_agg.png delete mode 100644 testing/resources/embedder_tests/text_form_no_highlight_agg_mac.png delete mode 100644 testing/resources/embedder_tests/text_form_no_highlight_skia_linux.png delete mode 100644 testing/resources/embedder_tests/text_form_no_highlight_skia_mac.png delete mode 100644 testing/resources/embedder_tests/text_form_no_highlight_skia_win.png create mode 100644 testing/resources/embedder_tests/unfocused_text_form_with_abc.dump.txt delete mode 100644 testing/resources/embedder_tests/unfocused_text_form_with_abc_agg.png delete mode 100644 testing/resources/embedder_tests/unfocused_text_form_with_abc_agg_mac.png delete mode 100644 testing/resources/embedder_tests/unfocused_text_form_with_abc_skia_linux.png delete mode 100644 testing/resources/embedder_tests/unfocused_text_form_with_abc_skia_mac.png delete mode 100644 testing/resources/embedder_tests/unfocused_text_form_with_abc_skia_win.png diff --git a/fpdfsdk/fpdf_formfill_embeddertest.cpp b/fpdfsdk/fpdf_formfill_embeddertest.cpp index 284d00bf27..a130f75d1c 100644 --- a/fpdfsdk/fpdf_formfill_embeddertest.cpp +++ b/fpdfsdk/fpdf_formfill_embeddertest.cpp @@ -1371,16 +1371,11 @@ TEST_F(FPDFFormFillEmbedderTest, Bug1477093) { #endif // PDF_ENABLE_V8 TEST_F(FPDFFormFillEmbedderTest, FormText) { - static constexpr char kFocusedTextFormWithAbcPng[] = - "focused_text_form_with_abc"; - static constexpr char kUnfocusedTextFormWithAbcPng[] = - "unfocused_text_form_with_abc"; { ASSERT_TRUE(OpenDocument("text_form.pdf")); ScopedPage page = LoadScopedPage(0); ASSERT_TRUE(page); - ScopedFPDFBitmap bitmap1 = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap1.get(), kTextFormPng); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), "text_form"); // Click on the textfield EXPECT_EQ( @@ -1396,30 +1391,27 @@ TEST_F(FPDFFormFillEmbedderTest, FormText) { FORM_OnChar(form_handle(), page.get(), 'A', 0); FORM_OnChar(form_handle(), page.get(), 'B', 0); FORM_OnChar(form_handle(), page.get(), 'C', 0); - ScopedFPDFBitmap bitmap2 = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap2.get(), - kFocusedTextFormWithAbcPng); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), + "focused_text_form_with_abc"); // Focus remains despite right clicking out of the textfield FORM_OnMouseMove(form_handle(), page.get(), 0, 15.0, 15.0); FORM_OnRButtonDown(form_handle(), page.get(), 0, 15.0, 15.0); FORM_OnRButtonUp(form_handle(), page.get(), 0, 15.0, 15.0); - ScopedFPDFBitmap bitmap3 = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap3.get(), - kFocusedTextFormWithAbcPng); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), + "focused_text_form_with_abc"); // Take out focus by clicking out of the textfield FORM_OnMouseMove(form_handle(), page.get(), 0, 15.0, 15.0); FORM_OnLButtonDown(form_handle(), page.get(), 0, 15.0, 15.0); FORM_OnLButtonUp(form_handle(), page.get(), 0, 15.0, 15.0); - ScopedFPDFBitmap bitmap4 = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap4.get(), - kUnfocusedTextFormWithAbcPng); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), + "unfocused_text_form_with_abc"); EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); } // Check saved document - VerifySavedDocumentWithExpectationSuffix(kUnfocusedTextFormWithAbcPng); + VerifySavedDocumentWithDisplayList("unfocused_text_form_with_abc"); } // Tests using FPDF_REVERSE_BYTE_ORDER with FPDF_FFLDraw(). The two rendered @@ -1440,23 +1432,19 @@ TEST_F(FPDFFormFillEmbedderTest, Bug1281) { } TEST_F(FPDFFormFillEmbedderTest, Bug1302455RenderOnly) { - static constexpr char kBug1302455ReadOnlyPng[] = "bug_1302455_read_only"; { ASSERT_TRUE(OpenDocument("bug_1302455.pdf")); ScopedPage page = LoadScopedPage(0); ASSERT_TRUE(page); - - ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap.get(), kBug1302455ReadOnlyPng); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), + "bug_1302455_read_only"); EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); } - VerifySavedDocumentWithExpectationSuffix(kBug1302455ReadOnlyPng); + VerifySavedDocumentWithDisplayList("bug_1302455_read_only"); } TEST_F(FPDFFormFillEmbedderTest, Bug1302455EditFirstForm) { - static constexpr char kBug1302455EditFirstFormPng[] = - "bug_1302455_edit_first_form"; { ASSERT_TRUE(OpenDocument("bug_1302455.pdf")); ScopedPage page = LoadScopedPage(0); @@ -1471,18 +1459,15 @@ TEST_F(FPDFFormFillEmbedderTest, Bug1302455EditFirstForm) { FORM_OnChar(form_handle(), page.get(), 'A', 0); FORM_ForceToKillFocus(form_handle()); - ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap.get(), - kBug1302455EditFirstFormPng); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), + "bug_1302455_edit_first_form"); EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); } - VerifySavedDocumentWithExpectationSuffix(kBug1302455EditFirstFormPng); + VerifySavedDocumentWithDisplayList("bug_1302455_edit_first_form"); } TEST_F(FPDFFormFillEmbedderTest, Bug1302455EditSecondForm) { - static constexpr char kBug1302455EditSecondFormPng[] = - "bug_1302455_edit_second_form"; { ASSERT_TRUE(OpenDocument("bug_1302455.pdf")); ScopedPage page = LoadScopedPage(0); @@ -1497,18 +1482,15 @@ TEST_F(FPDFFormFillEmbedderTest, Bug1302455EditSecondForm) { FORM_OnChar(form_handle(), page.get(), 'B', 0); FORM_ForceToKillFocus(form_handle()); - ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap.get(), - kBug1302455EditSecondFormPng); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), + "bug_1302455_edit_second_form"); EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); } - VerifySavedDocumentWithExpectationSuffix(kBug1302455EditSecondFormPng); + VerifySavedDocumentWithDisplayList("bug_1302455_edit_second_form"); } TEST_F(FPDFFormFillEmbedderTest, Bug1302455EditBothForms) { - static constexpr char kBug1302455EditBothFormsPng[] = - "bug_1302455_edit_both_forms"; { ASSERT_TRUE(OpenDocument("bug_1302455.pdf")); ScopedPage page = LoadScopedPage(0); @@ -1531,31 +1513,28 @@ TEST_F(FPDFFormFillEmbedderTest, Bug1302455EditBothForms) { FORM_OnChar(form_handle(), page.get(), 'B', 0); FORM_ForceToKillFocus(form_handle()); - ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap.get(), - kBug1302455EditBothFormsPng); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), + "bug_1302455_edit_both_forms"); EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); } - VerifySavedDocumentWithExpectationSuffix(kBug1302455EditBothFormsPng); + VerifySavedDocumentWithDisplayList("bug_1302455_edit_both_forms"); } TEST_F(FPDFFormFillEmbedderTest, RemoveFormFieldHighlight) { ASSERT_TRUE(OpenDocument("text_form.pdf")); ScopedPage page = LoadScopedPage(0); ASSERT_TRUE(page); - ScopedFPDFBitmap bitmap1 = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap1.get(), kTextFormPng); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), "text_form"); // Removing the highlight changes the rendering. FPDF_RemoveFormFieldHighlight(form_handle()); - ScopedFPDFBitmap bitmap2 = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap2.get(), "text_form_no_highlight"); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), + "text_form_no_highlight"); // Restoring it gives the original rendering. SetInitialFormFieldHighlight(form_handle()); - ScopedFPDFBitmap bitmap3 = RenderLoadedPage(page.get()); - CompareBitmapWithExpectationSuffix(bitmap3.get(), kTextFormPng); + CompareDisplayList(RenderLoadedPageToDisplayList(page.get()), "text_form"); } TEST_F(FPDFFormFillEmbedderTest, HasFormInfoNone) { @@ -1719,9 +1698,7 @@ TEST_F(FPDFFormFillTextFormEmbedderTest, FormTextFieldBiDiLiveEdit) { constexpr auto kInput = std::to_array({'A', ' ', 0x05E9, ' ', 0x05DE, ' ', 'B'}); TypeCharactersIntoTextField(kInput, RegularFormBegin()); - - ScopedFPDFBitmap bitmap = RenderLoadedPage(page()); - CompareBitmapWithExpectationSuffix(bitmap.get(), "bug_535730401"); + CompareDisplayList(RenderLoadedPageToDisplayList(page()), "bug_535730401"); } TEST_F(FPDFFormFillTextFormEmbedderTest, GetSelectedTextEmptyAndBasicKeyboard) { @@ -1802,9 +1779,8 @@ TEST_F(FPDFFormFillComboBoxFormEmbedderTest, FormComboBoxBiDiLiveEdit) { constexpr auto kInput = std::to_array({'A', ' ', 0x05E9, ' ', 0x05DE, ' ', 'B'}); TypeCharactersIntoTextField(kInput, EditableFormBegin()); - - ScopedFPDFBitmap bitmap = RenderLoadedPage(page()); - CompareBitmapWithExpectationSuffix(bitmap.get(), "bug_535730401_combobox"); + CompareDisplayList(RenderLoadedPageToDisplayList(page()), + "bug_535730401_combobox"); } TEST_F(FPDFFormFillComboBoxFormEmbedderTest, diff --git a/testing/resources/embedder_tests/bug_1302455_edit_both_forms.dump.txt b/testing/resources/embedder_tests/bug_1302455_edit_both_forms.dump.txt new file mode 100644 index 0000000000..a69fa49575 --- /dev/null +++ b/testing/resources/embedder_tests/bug_1302455_edit_both_forms.dump.txt @@ -0,0 +1,14 @@ +SaveState +SetBaseClip [0,0,300,300] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,300.0000) line(0.0000,0.0000) line(300.0000,0.0000) line(300.0000,300.0000) line(0.0000,300.0000,close)] +SaveState +RestoreState +RestoreState +SaveState +DrawDeviceText font="Arimo" size=25.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,101.0000,193.6750] glyphs=[(idx=36,u=U+0041,origin=(0.0000,0.0000))] +RestoreState +FillRect [100,200,200,170] color=0x64dde4ff +SaveState +DrawDeviceText font="Arimo" size=25.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,101.0000,133.6750] glyphs=[(idx=37,u=U+0042,origin=(0.0000,0.0000))] +RestoreState +FillRect [100,140,200,110] color=0x64dde4ff diff --git a/testing/resources/embedder_tests/bug_1302455_edit_both_forms_agg.png b/testing/resources/embedder_tests/bug_1302455_edit_both_forms_agg.png deleted file mode 100644 index 98a828669c0aa453626ef46171c1b21fd31369ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1632 zcmb`Ic~DbV6viWJOQDX-C~C)o*3wppw&RRAI9NwVi&zD>zL&fZlE4jN3usFq>}yyQ z1S$lo0wRJ60m3e5WVI?~6G&u-vL_+SOJc*4_=?28>p#6Scjh~1&Ufz2Z@!tEc;3-| zgUJ^rI2>++!|9V3akw@3_t$vsO2;uj+#ZKB%0GYh@+pW2AR-+iG9aP{gfJk)6GFTo z#2Z3nCK283>fi(otdyp5bP2UQ<7j> z3hbH&yZsKkrNeF+uzM!#nM)u70@;g51VmODF_4cC0fNvGMijy>M}jIzB;bqyXW;J~ zSx-g)Ik?K@*BlDXi{cSP@rt1ML{d0SR0L3cV`vDVUH{V+0j^}=h5*1y2C40IXFyNu zU?70u&Sc!|^zdeRxzW8zz&kXHNdio6H#2+SijOag9mQhDu%d3U?)3+dL7+1T42lX2 zj%5RSaLH^4J1C@797+M9Ws)!o2rH9>lRqeIAXZ250u0Bh-+B}c7r2Dr&F6hV!>Fyov?i+tSr0lsL(Su^W zf4%HOF(HbHiV{S_^CA>`^C5fwHrZku?LF zV>1HoOheX;uw_P}pH*YC8f8TSb~t(bGJ8-qEY5Ud?P^4= zfBM|&n>{ja-pia4{QipSyAG%Kovo=T+s~~c^ms8h?~C-CcrFC;4QT^iGIkHni*L;rhGdU#;U)o1)j7ni&xcVhw&(aBya;;snlgRqTme znOW&dbBVu6*AeSroh8cYkPwYzt@yq)Kr)d?RvO0?X(0z~6kM@^Bdv^a*b_ zuld|$aR6zfwVc_1#M)X~_dp_y2&)$Exzc6TJ24%!$e-|SfotT$i)trI!%+FsoE?F- zaX~$1^KAAKfkt>0^L;@|)XLf^VNVN{L$eh97}~p)aGda|nVrQUqKUOTi_O1uA?0ww zy~13=m(l<5kdE9i?~H=J@`DDdZzGHiShpBzO9S+u4d}TBro4z8ryC!nwR&r4gU2gB zeltHH@P_=|4rmk9H2cf#5u4o`A!AYA@meQ87Iu-ahQP5tNGjb)^gPJJ@oxGRHlS~G zN#EAATzfHy_6sOqYyAb%y(<)FXGRCZ{8W8?6?!%GIZZ#H<$AsXuJo4rvBqmnR=SFS ze2eR)@$t}|b=IFqTVqvavbK&6{d8rLeQo2J#Eky_16JZrTmD7Y?8V)ad5i;ZH8(xO zbkpBiiWEov!k1O&Ib(Fuq6uWeQ=57pt`Q_ g{88gO^#P;x+m$riU3pJdeh!?&DaVtgC#cc?0ztuCVgLXD diff --git a/testing/resources/embedder_tests/bug_1302455_edit_both_forms_agg_mac.png b/testing/resources/embedder_tests/bug_1302455_edit_both_forms_agg_mac.png deleted file mode 100644 index c30cfbbcd6b707e1dc5f5dd74cce20a82e44e56d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1197 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAjMc5QzN6(B4g5{Vu2_lCO#`RAv-=XCq5}RF*z?etso`6Fg>#*BfBgsr#vgS zB0CR=Ds%EHbMvcm3##)9Yl=$iOUfHd%bUupS}LkqD{IO1Qix|>@2o7*O|v`=hl zpVZMkwXS1%CF=J+8JbmVp8MBwon!95D zqBRQ^uUooe^Rksdv}MJrtt(b#XNrK=AvUwe4%=HqKOpWL|p?B<*ajczy5ToBNO6Jb3i>;gffd zp1yzl^uyz4AD=u2qED~h{&@ZF$D4OQ-+uV@?&I(GpZd62ZFqgWvvVh zO#eMy978H@y}c9eFOn$H_R#%6TXy~p?WFJ=?Qi$EBOEuDYi@e|-#W@Vpg%->rdy}#QX&^lB#`{b>@o&#D(qAp&&y0z5TdlO%n z;%yZ4VCGuf{*VZ*QHvSH`n!K0q$EMZJem6FE zZA=T(np*j|JM6oA#L{zXCc3jvI=jJ3?!(vSld=)28}rncCr&-GYu=m|pn=;gcXF;~ z$o~G|!Gp)U#jmMrA5WNiXY-~%Gq)!Oui+OCD7G?-{ga~kHBu51RKMgQL9>Ac5@ehZ zVIfF>szSo|_4m)G1tB7)hUb50eRbgtvs^PzrFMf?Vy|viLT-B~*XyWet`wRNU3`>U%eEZFCb)3EpdWWnM0jt*0I?-T!yy zPd=c>kDZavwUJXfo*e`D5KPm!#G_i)gRgwfceBnq?7(r*1j-FYFTMYRzjq zpS(E|VtwfwTbS{ht(o$(W~?%Q*?5&@wf#+V%g|g;vHpXk{zJC+5`>tZN)`YB diff --git a/testing/resources/embedder_tests/bug_1302455_edit_both_forms_skia_linux.png b/testing/resources/embedder_tests/bug_1302455_edit_both_forms_skia_linux.png deleted file mode 100644 index 48ee4e3e72ceb3b1c213c05ae5a528ebadffaf36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1063 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAjMc58 zG9@A^H8MIaDkeQTHX|l3Gd4aeAt^U8IWH+CKRLA^HN7Y;qc|h0G&8#_C$BO$zbe15 zrnt1Bq^z;5qPe=Zqo%I2w!W*bp}W4Zr=h90vAM6MZDMQtr1s7!J$*BK`)5s;_;JL&YZh>_WZ3&SMFcF z`rz7)$2V?0y?yt^oqI3uKYa7>@w>-QKRkK%@#*tV&t80f@#^c#*WX^h{qg4A&$sV? zz5DR{{l`BaKmYsmEaktaqI1!mwv&HGRGcn4~S-6Q+1>^{Em1) zp?Hi#A){96p8wGwo4IN>%KFAMoqx~w?BvXo_LC={Ob-=j*^qFsiIrQ7DFVV^)B!VE z8N|R0CkAdXL$Lv<1}GwM0Hjzaf&-#UhsxRy+P8)NbAUQ&&E1x(o|CrhYEO?lEY-Vp z{q@(rz3OW%Ba}D3n-+BHS-0BT{tc@(ctv{6JGkn|D|PM-S{vsrPnHf#%-u70ZpK-w z2dmxMRn*0L`4(^dX6}1gM#BHINZ8YvUo-d3mfoPn|KpRvTYjLPYxUJ+5gPHj+}iSK!}^`2FMPL6dij0BsM6Rsx4o{W$?xa!cW_h-M(X$fsLot~Wic28qyv+3O5 zPixj4T6LgmX5N0Cv?S(h8Ed+C#&}sysRVjC?0d?}DMi-q3B5;lOA`Z^fxT^fggZ5pTX1B&t;ucLK6TNL-)4; diff --git a/testing/resources/embedder_tests/bug_1302455_edit_both_forms_skia_mac.png b/testing/resources/embedder_tests/bug_1302455_edit_both_forms_skia_mac.png deleted file mode 100644 index 6e3d11ca828b270ef660657646ec0f456efbbdb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1051 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAoV%GC&V>8G9@k{J0-0!Bdat! zw<52gx}d1Gyt1XTx~-i~tlbN$S@n`h78 zx^U_4#mo0DUAced+QVx%9$&xt-!JiJbe7_(UbR& zpMH4q?BlZ+pP#?{^5WIk*KdEkdH3_}`(N)q{C@xO&xcQcKYsrA>C1m0n4_0{kAZ>d zv8Rh;NX4zUcTNTc2a2>^wD(|fJ$R$BOX?`!8%Eb&-7cI)dxj;7CVo}ZUSqtWYr{O1^vV7kyf&m=zT=a3K_4B2AWJl0g7yt{YhIn~)4+!E({Bv=2Rwm5r(Tf$zSXYI+R z#c!drWe{=$ f3k4e2)Zg=;AXdjD&F!iN%8G9@k{J25#gEu%Oy zyDYDuI=`@{xU`|9tg)i1wX(Xcs;0fRzN@aGyS}lfp{cjAxv#0EzoTnvSI_kRiE}1S zo;Q8wl38<>&z`$t?)+7Ymu^_LV)Lps+t;kyxpDKpZ95L{-g{!tzLN(Iojr8q{E1Un zPoBPZ`s|G}=Wd?6aQnigyB9CtyL9FLwHuFb+F>wS|2}>B4+M|RPRw9nV7lVz;uunK>+PMu z{7VTU4G)70f|pHhQtDDVb;P&i)SWh?sQ>@Z-(ofD5r4hh^Xir7dllZM&flW0&YM{i zT-3-QrW3It;h+-(H<+Q=zzSvv9B2YFI1&zm87x3GAO;giF_6Is*45NXW$izXZ#ZQy z05O|&wPVEey&WALVegMhuE|={Y;&GJTCjW>>l&>!lQ-#{e)M^AMFE>O=V~4Cxo-v6 zc&)h$BKUvH9d=oBweVh5?t$fN`2?H$Tdyi+mY(2`{`jHSTDve!^!?{Ip^VzO2c~~6 z(-qz~Gs5&O-`OL(UL5i|W|epUFN-$k>sNRGR%~mUy2(n$<;Y|1)y}tqc9~aHr)qv( zCIShqU-FR9*}wt`HBN}I5X9lCkT81v{quBXXmDLypR8+jG5(O(;aM)$vk!V5iuz`) zzj?WKgl5F%oErTk(#8~Bhff3K|{=K|O zr$1>&Q)sK{U5#4v=2Gcv*AG7XseR1w+rxQWYbvXM`>uEqduW$vwryAS&t-e7+-jOP zh|QfHXu3B2h&f00CgD|?N6gu?Z}u;K8@kqgYtN5o33F5Kex7}L*7kaf#;?V%18wf# z^@*1|Dl*M{DI}7^9ydc$13qthL)1=#CKO0=i6A0;aB933|6WR)>&d)xmm9o*8I{4) L)z4*}Q$iB}|5VT{ diff --git a/testing/resources/embedder_tests/bug_1302455_edit_first_form.dump.txt b/testing/resources/embedder_tests/bug_1302455_edit_first_form.dump.txt new file mode 100644 index 0000000000..f806783755 --- /dev/null +++ b/testing/resources/embedder_tests/bug_1302455_edit_first_form.dump.txt @@ -0,0 +1,14 @@ +SaveState +SetBaseClip [0,0,300,300] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,300.0000) line(0.0000,0.0000) line(300.0000,0.0000) line(300.0000,300.0000) line(0.0000,300.0000,close)] +SaveState +RestoreState +RestoreState +SaveState +DrawDeviceText font="Arimo" size=25.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,101.0000,193.6750] glyphs=[(idx=36,u=U+0041,origin=(0.0000,0.0000))] +RestoreState +FillRect [100,200,200,170] color=0x64dde4ff +SaveState +FillRect [100,110,200,140] color=0xffff0000 +RestoreState +FillRect [100,140,200,110] color=0x64dde4ff diff --git a/testing/resources/embedder_tests/bug_1302455_edit_first_form_agg.png b/testing/resources/embedder_tests/bug_1302455_edit_first_form_agg.png deleted file mode 100644 index 23e37a258868179d20fc09f256e64b22f854f887..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1145 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAZKcTPl#(+WJ*|6W>{2KSX6FU zR9;wgMObuYSaelbbX{0%b9iJ*cw}mLWLkJsdU#Y;czjQIVt;tj#PH-v;mK3Nlc$Df z&X0^ti7Z_oS-v4EG9{{FV^rnln5dMPhF$TAS@Agy@vR3FqEZrpsQXxQR7%Q(GpQ5L zrbnfuPd=BGoSGe-k_$w0ZS+;h{>blI0 z&DonZBPGh@66l&^zV*mfA{nk?&~i+^ydHJDJ5s;RbRM#@8azbmzLCD z`uP9K$NyJ9{=fF||MitE*H^XNzH;yGhOWDx{y%tm>haDgPd@*Dws+dI{WG3_{{Q^T z{}*5WzdSns)w>_B&n$iY_QUIUKi-~S@%GFAcVGU$zq#f8{ax=L?0Wy@|A$8hK0H10 z;mh}rktrWvpZoak>c;~Ds5>CmL);2+*|kTr>gh(rlR1oQv;bv)td;i}71R_tKZ7Q1$3?WWx9DB}%}5^8g_?c?|Vlv^Va zar5`p(!=WE^O{7NU!Q(?Nci#gU|#)1*W|sof^Q1VvYeD>c-->KFSnZq?~Xsfb@Y_& z?U^UG|I=C%u;#sZ@Ydh|x2!j;G+@@|c^!Ltm2tg$YWphldyS$^UsrF>I{jdOsC=JD z=|Qf8vtD?}ox6Xp-+N{3`NXqP?+X9kI{h>ADmFzfRk;35V>gTe~DWM4f D@1!Q3 diff --git a/testing/resources/embedder_tests/bug_1302455_edit_first_form_agg_mac.png b/testing/resources/embedder_tests/bug_1302455_edit_first_form_agg_mac.png deleted file mode 100644 index 6d65fb18f8b5b2c7f90574534cd88342c461273e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 899 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAjMc5W=TeNSyoPYR&GUh9uQUL z71orLHerc7Hnb;hEpGZxR9yJErO zbxT)lUbYg5wyapSb>*6E+jbt=z6*$s?mcj7|G_hdk6k!=;_~s6S5BP1dh*P*OIPk+ zy87VqwTCzFJiBxM<-G^5?>&6;;L+QMPu@Lx`u_2=k58U|eEsgnn|D9oef<65^WTq= zDIY)o`}pNQ5bR_YT*bh^6yxdQ7*cWT?Ty=3p@|Hw4->;ZT2roX^3?9k2@X!Zob>nI z|4A|m?$74uF0Sh>Y?A~+Hbf*C9uAPlAm2!l}v%xGl*ssV~P zF@O|rNKkA5>)JqV?fpEjA2C8)1a%0+eu!;QH$t5Dx-i*xDpUmG_6Vp(7Kj@;Ax{4F z`xG-&&sjB1 zR~x?Cz6=Qs4b?Zk+8)}!b=vN430IT;%ALRP`Sm2%h^-N`Pd=X=>Md#47TW&REIHkL z^|#5T5vCFMCtbZA`uF4>yY^E1YhFb^(ytv)5x=(gtDAAL`RnTe(-L=1O$2*zjk-J} qG*lrW;0+0)X+#8q5G5M_RfeaV-AT*cty>JtNDQ8?elF{r5}E+F`Hm6* diff --git a/testing/resources/embedder_tests/bug_1302455_edit_first_form_skia_linux.png b/testing/resources/embedder_tests/bug_1302455_edit_first_form_skia_linux.png deleted file mode 100644 index eb49f0f23d5302a8815dbd02079ff7a92621b26c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 851 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAjMc5t>MSw(YoZAVRA zXKj5~T|;+6Q*Uegr1s7!J$*BK`)5stw_*3j&HJ|PIJ|TBv0ZzP@7;fD|G_f{4xK%I^2(WWH!oeefBEWzYd0R> zxb^h*-4}Q6y?pri-Q%YpUcCDH^7Xej?|#1f@caG8KOaB;`xKe->C1m0Sidl62Ll6> zi>HfYNX4zUH{64m0!7*`YHK7NnNxgVj%d`Eo&QrUCorj%m0LP=S>5OR7yR8fu4ZLP zBZHVu#D;`}P7K^&hGGLNm?3bW3C!R~I0$C20M&pPOd!QT1|wKkQ!ACVOBk*>ugC&% z3dCZleGped+yrsKwT$FmZwPZ5)R9mfP*qT4{_ZttfyzfbZu=@@c)Kx_@3n$fA@6FD zFf-ZX8`*%gaoDY^6^)^6s|Cd~wfPdK9@y0%HSOJ^e|)PYvemx@dvOQ}i6hv{8=?P60FKG%gA z$PA2su~vwGL(v8+}J85)Q<8n3EEX|L>W<+xN*il(FgsFk>)yy85}Sb4q9e091)(qW}N^ diff --git a/testing/resources/embedder_tests/bug_1302455_edit_first_form_skia_mac.png b/testing/resources/embedder_tests/bug_1302455_edit_first_form_skia_mac.png deleted file mode 100644 index 18035f3a7a5bccc1bde64777251e86843e896f60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 827 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAhkNcC&V>8G9@k{J0-0!Bdat! zw<52gy1cTbrmnNObwX?Vq^_Rn-Muq<`)Bn}oHJq4+$qx*&Yrts-h$N&7q45fYU|3? z+g7dFzIyGBHS2b++pv56#yxxXo!qC$F41b@k-wYp2d!KXdNp zg-ds@-FSTc=93$@p5DFx>i)ww4v)0h81Ad|bWl7WHA+tbA{q~g}w8}5G0fg&y!jb_Z5eA3cPP5SfA z|EFdsBsA@Ab=h?8uH)Q;(tB)H7dkR?<_PAE@1o^5EKB4)a?5X9T)3`EY((=0wM)CIV@oHkIV9Ck zI!$NaS*g=6l-Hc!C^q@>_Q=^M?bi6e-fHyE?zP&?=BI0UAim+Pg#^Jgh_{LHvMMC9 gyeZN6>uVfC;h7Danr`_<0&@d{r>mdKI;Vst0Cf;@KmY&$ diff --git a/testing/resources/embedder_tests/bug_1302455_edit_first_form_skia_win.png b/testing/resources/embedder_tests/bug_1302455_edit_first_form_skia_win.png deleted file mode 100644 index 3c2468571dbae5d5cf0ba9f23b2bfa78ece27096..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAXOCL6XF^knG%C1m0cv5HX$iTql?&;zfQgQ3;je|i=0Ss*yyCub3(-vsDExP!7e-d}lY_U@&&6efo zwkNbbwJrWB-s1mNPoaU8TTCZngTR3%FoPrEAeh0j0m5L4fG`+=YJeiG3?Rh`2b~ze zx)KzrtbHBN>&HwG7eFnB*avYO)J+hll-`Zl$O3T%Cq$7DL_!s!(;K4t+Wl;O0f+>v zw%Hmj-bmin@?nB*Cz-3vCcnmYQuyR8O;?#$pPYO&PmC+Vc0<_XHSgp$ zoJ%a7zUpNAtRE{jT$}uHRqpM|6VegSH=Oc&d7I~&=9;s~-~YZ%OWf96DwS=?_50oZ zgtFVdQ&MBb@0CQMK>;M1& diff --git a/testing/resources/embedder_tests/bug_1302455_edit_second_form.dump.txt b/testing/resources/embedder_tests/bug_1302455_edit_second_form.dump.txt new file mode 100644 index 0000000000..02bc82b17b --- /dev/null +++ b/testing/resources/embedder_tests/bug_1302455_edit_second_form.dump.txt @@ -0,0 +1,14 @@ +SaveState +SetBaseClip [0,0,300,300] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,300.0000) line(0.0000,0.0000) line(300.0000,0.0000) line(300.0000,300.0000) line(0.0000,300.0000,close)] +SaveState +RestoreState +RestoreState +SaveState +FillRect [100,170,200,200] color=0xffff0000 +RestoreState +FillRect [100,200,200,170] color=0x64dde4ff +SaveState +DrawDeviceText font="Arimo" size=25.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,101.0000,133.6750] glyphs=[(idx=37,u=U+0042,origin=(0.0000,0.0000))] +RestoreState +FillRect [100,140,200,110] color=0x64dde4ff diff --git a/testing/resources/embedder_tests/bug_1302455_edit_second_form_agg.png b/testing/resources/embedder_tests/bug_1302455_edit_second_form_agg.png deleted file mode 100644 index af0a50b90918b3ccc0b2f458c2efea445ca94811..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1005 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAjc)ZC&V=@G9@fBH7qhcEHWc3 zDm^SJD=aEIEGj1~DlaU$IxMy|JSsgrCO15;GCZz5JZ*YJWJ*MAR#a4KRC;4{bV^K0 zNo-U~Y}J;yqIvNdmGN2i33<&)Q7K8WDJiABsWB<(X}KBMrP(zza-&mnr(Gz>$t!J~ zRl4X#c}z-qWn+0&OGQd*bwy=eY)ajPb@dxwHN>VgZu!{M+|%4Pp*1e0ZP)kqy+1nk z{^(qOu_rmDckip-Lq8^#WX--+e(TSQY3(api&x+MyW`5Iop*oldj9v! zj-?ka-@9<-!R6B@u73P~ZB@s$J8$k>y?6KB|GOXlKiWO@$&;5)KL3Aq_3*Rzf1iK; z|KiQ}7oY#XeEsF+o9}PVEqi}^%loG{-@keN{>%RlkM?|cw(rB2{~se$KE65f@!gq^ zpTB(k^6TT5KOevR{rKfS5G-w6lf=Nll;Y{)7*cWT?Tza}B907g7Zo`)JVH)dzSJr- zY?xHcHu1rv>3jD4-<$W7;qp_~oP$5_CHRH<|G#>1Z&SCxfhJaNF`WpGgo9uP%LWL8 zDFVV^)B!VE8GvelB2Ek-#Tyb78^F3YP+PlY+tkVihzr)l9N%>>;?%Z1`?$5mUT2y7 z3XeSggmI0*bfmT5ouiclel#(#M6ncRjm3?WMqu&0NyIo?qJVsPEx{I<2q2 zpPwpu{d!|?M56tV*;~s+xi=izV3b~~dOwjhX)eE5O`B+2>Gr!{ie!KWo_utCMVV;W znUadz|F&;44-7HSw_~+E*D!;BH`ngc>I#5QQMJs*oUl{eO1_ z)XNZYNXSCt1EL0^{otwGHOo;odqZMr8dNnT4kL)Ll|+qld+nowlh^EgRTu`$#tfdW KelF{r5}E+VQrpJ> diff --git a/testing/resources/embedder_tests/bug_1302455_edit_second_form_agg_mac.png b/testing/resources/embedder_tests/bug_1302455_edit_second_form_agg_mac.png deleted file mode 100644 index f18aa4048bef973b9746b02bb395433a9f7b71cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 855 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAjMc5epPNkbzWgjQE7c?c~eDIYh_JaQ)_>7+k}?( zNgdr&yLzWjoIG#R)CE(fFPb)U@${KXX3SnTf6ec{sG%hw)W zyZQLq%_lc*Kf8J7+3kBT@7{lP|IwSrPd_|){^`}*A8+3MeEZ?o`%iyAeE$0}GUemv ze;>d62ZF+cKX(}zm~1><978H@y}jWY#2hHmda;}J`h$0QjSr;0?bqPqTJ}YoZ9>!M zw+qfcsNZg-ucgP4aIlG$TTF*#1BAg80bwxefEld}Vqk_715gc6M6m&+IAVjq0kEzJ zDr;{tJDl~`0pfzN-N|=#_if)&TEo1W>$TPVQoTEeR~>n^`ugj~&ax*B)_AS?`8|J^ zl#gD*)Wof2lS3m~BiK(`t#Mj2^NC29=(Uu^7cFki^H?VP9ssn)BdR<90Q{dEuT z+L_T2uI8`*<(Nq}hgLj@EfrKSgDMbJ3y&L~|VKoD)p9K;ToRD}CBEoVaHU9b<$0)WXEJgjt1YovdVDNPH Kb6Mw<&;$SxV}UmS diff --git a/testing/resources/embedder_tests/bug_1302455_edit_second_form_skia_linux.png b/testing/resources/embedder_tests/bug_1302455_edit_second_form_skia_linux.png deleted file mode 100644 index 5d7db1b70b4c5a822870f116b7213363be3ef71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 789 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAjMc5mbZka!d{#nIZc<8qa%w?pdQn8MBtIT)l1c)&tvi9Nxb3$c|k{ckMa8@4)GUhtC~4a{lnq3rCJ!Jbv=ZnR7SK zp1*bN#^W2ep5DIu;{L-o4RgLTJ+2y7Y{-YS)~L*j5W=&$)AO)uCCwY&VM^WY@{w>Q%d0*%E5%RlWG{ z<8tfM{+f`0`6>?yfDKSrazesM2qLQr3B}jXYxNYM0Sb|aYJ!FulGHTm>`)?1^oGRF mG^hdKDAS3cMB}yj-+4FeDoJKz`eO)8+6wo+06 diff --git a/testing/resources/embedder_tests/bug_1302455_edit_second_form_skia_mac.png b/testing/resources/embedder_tests/bug_1302455_edit_second_form_skia_mac.png deleted file mode 100644 index ea1cbdc1ca6b7bf7e0ddae83c981a6b7b97842e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 784 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAT=$(C&V>8G9@k{JFlR+ps2RI zvZb=Rt-i6RwS7{1=ajCV>D|3E`X|nrK6A;8SxaZmUN(E~ig^oG&tJG^(USE`mv36V zcE{TFyVh;ky>aut&07!bJ8*jc!81pWT|9pB%9(RF&z`?^;nLlUm+xJ=a{tP;hqvxL zzkT<`oqI3uJ$U`-$@^z7KEHVN_4V5yZ{GcU`~KJakAFUX{`V;|<bcGk zo5HSdoX3|gJ3rPx@#%(TAFn=;3=>-&9(vWyKJ#m0>PEKB#&_4d+&Q3iILlp7eFN9V zV}i?pROJn`dt?tle-d9m-QPnv0c$8Od##_5XTC*a3_lj?1TU~HqJG-EA zL~F$3`;lA3gkKw-tpIXn3yN_|GQN?gb7gv31Vy_ugtD3Vu8d2Ct-tiAaN4` iiK-2hXk26eURLCQz(Jl}EXu$n&fw|l=d#Wzp$P!tbyF(< diff --git a/testing/resources/embedder_tests/bug_1302455_edit_second_form_skia_win.png b/testing/resources/embedder_tests/bug_1302455_edit_second_form_skia_win.png deleted file mode 100644 index 63428e6d1f75dfbe615d37936724b8ed6e2c46c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 762 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAk`J%6XF^knG%9aS^oV$7M!tD!}?q0ln@6wg~*KRz%dHdO|JJ0Vuc>Unf z+lPgeERYq2<~3jxWmA}r0wbA7*cWT?TyoZhXO>} zF6Mr0Tg3iRPb*Gfq1^rdUu7iQ?;0|C#@=7?cxu^m|Hr{EnHY5 z!3@O)Rxm^0Kogk30aOEGuz(Z;8BAbZtlU)Az9BWDlo?`E#D=PtuXcSM9T~@_7f0NU zI2?3pMdyvZnTe%|cdtif|1Og|UL2vhCMuqP|NMl~q`x)?UmdBs^<7eJ^UiOi=&; diff --git a/testing/resources/embedder_tests/bug_1302455_read_only.dump.txt b/testing/resources/embedder_tests/bug_1302455_read_only.dump.txt new file mode 100644 index 0000000000..c091f2b2c1 --- /dev/null +++ b/testing/resources/embedder_tests/bug_1302455_read_only.dump.txt @@ -0,0 +1,14 @@ +SaveState +SetBaseClip [0,0,300,300] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,300.0000) line(0.0000,0.0000) line(300.0000,0.0000) line(300.0000,300.0000) line(0.0000,300.0000,close)] +SaveState +RestoreState +RestoreState +SaveState +FillRect [100,170,200,200] color=0xffff0000 +RestoreState +FillRect [100,200,200,170] color=0x64dde4ff +SaveState +FillRect [100,110,200,140] color=0xffff0000 +RestoreState +FillRect [100,140,200,110] color=0x64dde4ff diff --git a/testing/resources/embedder_tests/bug_1302455_read_only_agg.png b/testing/resources/embedder_tests/bug_1302455_read_only_agg.png deleted file mode 100644 index c04a0dd0f7072092453860505e5bdc5b537e864e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&MrNRh^JW<{AjKBo6XNsb}Vdf0#mhTd?ju1S<=TWciTn>eGt jB~c=6ks(|%=YU*ref5k9e;iK%O=a+O^>bP0l+XkK0UI(m diff --git a/testing/resources/embedder_tests/bug_1302455_read_only_skia.png b/testing/resources/embedder_tests/bug_1302455_read_only_skia.png deleted file mode 100644 index 2887a76f8b98e46ff85b5697132ff381c0d3d6e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&MrNRh^JW<{AjMc54dAc};WZZjuZJ{880|)cLFY&svAHJ#b9hnz5*Rv{!^{@dC487r4 vU6Ux$w$@0vH*rRPOQJ;DB15=j&H=gL`sx`I{y3fjn#$nm>gTe~DWM4f_x&~E diff --git a/testing/resources/embedder_tests/bug_535730401.dump.txt b/testing/resources/embedder_tests/bug_535730401.dump.txt new file mode 100644 index 0000000000..5973718014 --- /dev/null +++ b/testing/resources/embedder_tests/bug_535730401.dump.txt @@ -0,0 +1,27 @@ +SaveState +SetBaseClip [0,0,300,300] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,300.0000) line(0.0000,0.0000) line(300.0000,0.0000) line(300.0000,300.0000) line(0.0000,300.0000,close)] +SaveState +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,150.0000] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(7.3320,0.0000)) (idx=86,u=U+0073,origin=(14.0040,0.0000)) (idx=87,u=U+0074,origin=(20.0040,0.0000)) (idx=3,u=U+0020,origin=(23.3400,0.0000)) (idx=41,u=U+0046,origin=(26.6760,0.0000)) (idx=82,u=U+006F,origin=(34.0080,0.0000)) (idx=85,u=U+0072,origin=(40.6800,0.0000)) (idx=80,u=U+006D,origin=(44.6760,0.0000))] +RestoreState +RestoreState +SaveState +RestoreState +SaveState +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,101.0000,241.6640] glyphs=[(idx=40,u=U+0045,origin=(0.0000,0.0000)) (idx=79,u=U+006C,origin=(8.0040,0.0000)) (idx=72,u=U+0065,origin=(10.6680,0.0000)) (idx=83,u=U+0070,origin=(17.3400,0.0000)) (idx=75,u=U+0068,origin=(24.0120,0.0000)) (idx=68,u=U+0061,origin=(30.6840,0.0000)) (idx=81,u=U+006E,origin=(37.3560,0.0000)) (idx=87,u=U+0074,origin=(44.0280,0.0000))] +RestoreState +FillRect [100,250,200,225] color=0x64dde4ff +SaveState +RestoreState +FillRect [100,290,200,265] color=0x64dde4ff +FillRect [101,171,199,199] color=0x00000000 +DrawPath fill=0x00000000 stroke=0x00000000 rule=even-odd stroke_state=[none] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,200.0000] points=[move(0.0000,0.0000) line(0.0000,30.0000) line(100.0000,30.0000) line(100.0000,0.0000) line(0.0000,0.0000,close) move(1.0000,1.0000) line(1.0000,29.0000) line(99.0000,29.0000) line(99.0000,1.0000) line(1.0000,1.0000,close)] +SaveState +SetClip_PathFill rule=winding matrix=none points=[move(101.0000,171.0000) line(101.0000,199.0000) line(199.0000,199.0000) line(199.0000,171.0000) line(101.0000,171.0000,close)] +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,101.0000,189.1400] glyphs=[(idx=36,u=U+0041,origin=(0.0000,0.0000)) (idx=3,u=U+0020,origin=(8.0040,0.0000))] +DrawDeviceText font="Tinos" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,122.7800,189.1400] glyphs=[(idx=2507,u=U+05E9,origin=(0.0000,0.0000))] +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,119.4440,189.1400] glyphs=[(idx=3,u=U+0020,origin=(0.0000,0.0000))] +DrawDeviceText font="Tinos" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,112.3400,189.1400] glyphs=[(idx=2496,u=U+05DE,origin=(0.0000,0.0000))] +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,131.2760,189.1400] glyphs=[(idx=3,u=U+0020,origin=(0.0000,0.0000)) (idx=37,u=U+0042,origin=(3.3360,0.0000))] +RestoreState +DrawPath fill=0x00000000 stroke=0xff000000 rule=even-odd stroke_state=[width=0.4000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,200.0000] points=[move(42.8160,8.3280) line(42.8160,21.7200)] diff --git a/testing/resources/embedder_tests/bug_535730401.png b/testing/resources/embedder_tests/bug_535730401.png deleted file mode 100644 index 9cd89de150220e3edd8a57ce1e56458cc426787d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3296 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 Wg!oKvTNd720C1aAuoCE*>;D5J_nyiC diff --git a/testing/resources/embedder_tests/bug_535730401_combobox.dump.txt b/testing/resources/embedder_tests/bug_535730401_combobox.dump.txt new file mode 100644 index 0000000000..06337f092f --- /dev/null +++ b/testing/resources/embedder_tests/bug_535730401_combobox.dump.txt @@ -0,0 +1,39 @@ +SaveState +SetBaseClip [0,0,300,600] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,600.0000) line(0.0000,0.0000) line(300.0000,0.0000) line(300.0000,600.0000) line(0.0000,600.0000,close)] +SaveState +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,150.0000] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(7.3320,0.0000)) (idx=86,u=U+0073,origin=(14.0040,0.0000)) (idx=87,u=U+0074,origin=(20.0040,0.0000)) (idx=3,u=U+0020,origin=(23.3400,0.0000)) (idx=41,u=U+0046,origin=(26.6760,0.0000)) (idx=82,u=U+006F,origin=(34.0080,0.0000)) (idx=85,u=U+0072,origin=(40.6800,0.0000)) (idx=80,u=U+006D,origin=(44.6760,0.0000))] +RestoreState +RestoreState +SaveState +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,101.0000,189.1640] glyphs=[(idx=37,u=U+0042,origin=(0.0000,0.0000)) (idx=68,u=U+0061,origin=(8.0040,0.0000)) (idx=81,u=U+006E,origin=(14.6760,0.0000)) (idx=68,u=U+0061,origin=(21.3480,0.0000)) (idx=81,u=U+006E,origin=(28.0200,0.0000)) (idx=68,u=U+0061,origin=(34.6920,0.0000))] +FillRect [186,171,199,199] color=0xffdcdcdc +DrawPath fill=0xffffffff stroke=0x00000000 rule=winding stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,200.0000] points=[move(87.0000,2.0000) line(87.0000,28.0000) line(98.0000,28.0000) line(97.0000,27.0000) line(88.0000,27.0000) line(88.0000,3.0000)] +DrawPath fill=0xff808080 stroke=0x00000000 rule=winding stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,200.0000] points=[move(98.0000,28.0000) line(98.0000,2.0000) line(87.0000,2.0000) line(88.0000,3.0000) line(97.0000,3.0000) line(97.0000,27.0000)] +DrawPath fill=0xff000000 stroke=0x00000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,200.0000] points=[move(86.0000,1.0000) line(99.0000,1.0000) line(99.0000,29.0000) line(86.0000,29.0000) line(86.0000,1.0000,close) move(87.0000,2.0000) line(98.0000,2.0000) line(98.0000,28.0000) line(87.0000,28.0000) line(87.0000,2.0000,close)] +DrawPath fill=0xff000000 stroke=0x00000000 rule=winding stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,200.0000] points=[move(89.5000,16.5000) line(95.5000,16.5000) line(92.5000,13.5000) line(89.5000,16.5000)] +RestoreState +FillRect [100,200,200,170] color=0x64dde4ff +SaveState +FillRect [186,71,199,99] color=0xffdcdcdc +DrawPath fill=0xffffffff stroke=0x00000000 rule=winding stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,100.0000] points=[move(87.0000,2.0000) line(87.0000,28.0000) line(98.0000,28.0000) line(97.0000,27.0000) line(88.0000,27.0000) line(88.0000,3.0000)] +DrawPath fill=0xff808080 stroke=0x00000000 rule=winding stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,100.0000] points=[move(98.0000,28.0000) line(98.0000,2.0000) line(87.0000,2.0000) line(88.0000,3.0000) line(97.0000,3.0000) line(97.0000,27.0000)] +DrawPath fill=0xff000000 stroke=0x00000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,100.0000] points=[move(86.0000,1.0000) line(99.0000,1.0000) line(99.0000,29.0000) line(86.0000,29.0000) line(86.0000,1.0000,close) move(87.0000,2.0000) line(98.0000,2.0000) line(98.0000,28.0000) line(87.0000,28.0000) line(87.0000,2.0000,close)] +DrawPath fill=0xff000000 stroke=0x00000000 rule=winding stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,100.0000] points=[move(89.5000,16.5000) line(95.5000,16.5000) line(92.5000,13.5000) line(89.5000,16.5000)] +RestoreState +FillRect [101,221,199,249] color=0x00000000 +DrawPath fill=0x00000000 stroke=0x00000000 rule=even-odd stroke_state=[none] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,250.0000] points=[move(0.0000,0.0000) line(0.0000,30.0000) line(100.0000,30.0000) line(100.0000,0.0000) line(0.0000,0.0000,close) move(1.0000,1.0000) line(1.0000,29.0000) line(99.0000,29.0000) line(99.0000,1.0000) line(1.0000,1.0000,close)] +SaveState +SetClip_PathFill rule=winding matrix=none points=[move(101.0000,221.0000) line(101.0000,249.0000) line(185.0000,249.0000) line(185.0000,221.0000) line(101.0000,221.0000,close)] +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,101.0000,239.1400] glyphs=[(idx=36,u=U+0041,origin=(0.0000,0.0000)) (idx=3,u=U+0020,origin=(8.0040,0.0000))] +DrawDeviceText font="Tinos" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,122.7800,239.1400] glyphs=[(idx=2507,u=U+05E9,origin=(0.0000,0.0000))] +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,119.4440,239.1400] glyphs=[(idx=3,u=U+0020,origin=(0.0000,0.0000))] +DrawDeviceText font="Tinos" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,112.3400,239.1400] glyphs=[(idx=2496,u=U+05DE,origin=(0.0000,0.0000))] +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,131.2760,239.1400] glyphs=[(idx=3,u=U+0020,origin=(0.0000,0.0000)) (idx=37,u=U+0042,origin=(3.3360,0.0000))] +RestoreState +DrawPath fill=0x00000000 stroke=0xff000000 rule=even-odd stroke_state=[width=0.4000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,250.0000] points=[move(42.8160,8.3280) line(42.8160,21.7200)] +FillRect [188,223,197,247] color=0xffdcdcdc +DrawPath fill=0xffffffff stroke=0x00000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,250.0000] points=[move(87.0000,2.0000) line(87.0000,28.0000) line(98.0000,28.0000) line(97.0000,27.0000) line(88.0000,27.0000) line(88.0000,3.0000) line(87.0000,2.0000)] +DrawPath fill=0xff6e6e6e stroke=0x00000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,250.0000] points=[move(98.0000,28.0000) line(98.0000,2.0000) line(87.0000,2.0000) line(88.0000,3.0000) line(97.0000,3.0000) line(97.0000,27.0000) line(98.0000,28.0000)] +DrawPath fill=0xff000000 stroke=0x00000000 rule=even-odd stroke_state=[width=1.0000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,250.0000] points=[move(86.0000,1.0000) line(86.0000,29.0000) line(99.0000,29.0000) line(99.0000,1.0000) line(86.0000,1.0000,close) move(87.0000,2.0000) line(87.0000,28.0000) line(98.0000,28.0000) line(98.0000,2.0000) line(87.0000,2.0000,close)] +DrawPath fill=0xff000000 stroke=0x00000000 rule=even-odd stroke_state=[none] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,250.0000] points=[move(89.5000,16.5000) line(95.5000,16.5000) line(92.5000,13.5000) line(89.5000,16.5000)] diff --git a/testing/resources/embedder_tests/bug_535730401_combobox.png b/testing/resources/embedder_tests/bug_535730401_combobox.png deleted file mode 100644 index 72d69ab4f595c957cb32c2098823ea05db8a3967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4108 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 Ct+7V{ diff --git a/testing/resources/embedder_tests/bug_535730401_combobox_skia_mac.png b/testing/resources/embedder_tests/bug_535730401_combobox_skia_mac.png deleted file mode 100644 index 4f7e93bb14316c4bfbc0cb795e675fd1fc181117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2723 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 diff --git a/testing/resources/embedder_tests/bug_535730401_mac.png b/testing/resources/embedder_tests/bug_535730401_mac.png deleted file mode 100644 index 7be356085ff148a673204d5fd029b4350fb83086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3098 zcmc&$Yc!kb8r93RDWy$Y463Fvl!`&st)b3nP>oB`x{Io+)-BXER5GKcNQ4+Cz?170o@4ST<_ zIDGQ2M9SgAC;wW&K`Dp-4eg(YWB3UZcyD*;qlE$T*pWjj27$edtW(aEG-X)rxM}J< zml~gE+5VNRoZJab7xHy_sdI_CP(OhAEsJQ&oM}lt+V2(dp6u7=WR!lwtRC4IXYF)M zRyNx-e(5N(LndW0zpthr2}AK3GLy4TInd^6hbm~Bg8e6AuQlJ7CQqzPv$^$AWuBDK za*vuGHhauBOWm#`Tg#OiJr_08S7bHtI?+}?Z z!SgaC=JSM`Xzf$C>Lk0wA>Sn8=41U1A8K^S6f-Z^2sQs@v#_1*&p;0cu0ks;9W61K zoo6;#&##slh74A_y;Y}%4A<$A&c&E`6kWMkBsuU$O4dGeu1V-g%<}PdGmda8tk}n*f;4o0vK85Qho`N7NIW84XvLp%s7u@ zoXWrJR13Y;ncM=u|I>Dycz%2lM& zGgq+$-PiG6bzvh*V{P$kvkL1(@GB7DF4coNjVn%coUEU(J0+AmuG*0Yi!luB)uqx!civ3d)=rOu_G z2Rc5OW@)3?Ah=s}-npni@s6m-P)<&+c!%m^d}q8}jig(F*;<k#n(Q! zW(UZSV<*k4f;m-zzdyeUNWW@?QODtM=_=-!U;GZ8FnwqX$oQ+Rq@?7fIbpkM#*Ldd zPr#ys`zyTlY%ugnpkd-q9||r22>}A*S$)eKO^q)1X~I}pS(Wmg z`E}uAL~YO3@tv&&>@2yBCf?aH_Oz9hl5$o(e)iVoGyKN*82H27TrCUm^1VXq48S#L zz`zJ1wDfX;Md^$iTvpko+`~XyJ7lyam7r+Q!DQNVeOpq%W32>)`ks9UQ?f$K z)CrS2&j3#DxrQM)gmV){bYBkN>0#Q{*@@szEw!mQBy6m(9ZJrp$xh;RXkU-0t>el) zDaeM{rJo?S)xgGR;Upkn!0H0O$+!7_spov-I?v64XljaH9?x<(uaG6JWcb33e7*ar z3QbdD*4=a|a|vnx`Q#s;{lhc_ zBi=>snYfitZr>4;s)1>ht_*7(Cwhizx-9ZebfYW@^3H>@mPmb2xf zjy0xwTHT~phhiV~e^YU$cZ4 zil?BnOVnL+?E0qlwpU79{xXE7=2zU!$&g{qFZ^6zbPO%2?9W`9t4QnxnImiKJ0lVb z$vREEzMA+ZbFn`rc=ki7^_A*y;XGPJJ7Z$zxd9fhJZh@S&v_Zu#tT2H-n7^=L-u6O z(tqhAhJ5zH)EHDm`Jgro4Xu7wXsqh1*qRjnjwT=EWr;H$wvod>>Yy!gAS@5$Y@HkJ z4Mf;rv$0OX>XDvRlbL2vSah)M%;R75gTj}&9PFEy3>BsgWVqJPCpfi!^t61|1#5=| zv#`5Elr7bdb+PKZ+J0JUzAeo3Q=J^n_Cak+qRrWZ8X*f>MLJrT; zC$tnExi@El9%zdpoQO{;6!nI6U-&?=C_-&L*@jWpG%!%cdScxCQQimdFW8SI<-#|n zag~{7?0k`Ec~}Rq3K%&{(hVI@x6knqa8kks)4pPu1}$odciztSI#?qhU0sSx%nb&k zmDHpXNdv_L8HYf3A|ts*SiY;<8JXkf9FL4p7aRzlb#4KzgUg4G7I%@TXH#_t@k6hF zGm6_f8^cAb&YFj9y= zH7<%#WkBAmow`Wz#!p$ZR_0;GByG-jfFTM%I^nZg#Y?HLZcZA1sAdk-_yzNtt2U4QrnS{aZ{t_u5VBjwq z1LF?=hunUjgxvk-eR4#Hlz(JJ_|Fht_`kgX|F(aSI|@g)I1E_ P`6X;D?co&`*Ao8@6`hqN diff --git a/testing/resources/embedder_tests/bug_535730401_skia_linux.png b/testing/resources/embedder_tests/bug_535730401_skia_linux.png deleted file mode 100644 index 18b891389563e100a40326147ffc0389db2dce21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2651 zcmc&$XH=7E8pUC7C>A1J1;$W!0RcfH24Td6-c(?v1sPlrsd1!)P*w>GB25uNN-Q9X zA%RdsR{{Z)B1rF5ih)29NJ2>14?VMI=eWOif6O`G{qub9d*A1~&%NJy@7dd$9TYt( zDj*IB+9V?q8c(!}~vf_Q(Hdd#yE z?~Icm<}EkGC8Q*dBxSeb-C$|ppJz!@4=VMF%c_!c)RD6LK_8njND#OhsdcyegU*3c zn5EAhY0D2b;=#tOhvns0exZz;Qx?-9pAC9YQ(m_s8c|r5fNz81KR&#{Rtvy{!9V_) z0Q~^|@lVBF;eDX*VUTI2fGR-94-5>*pio~1@p|5mwLP#KH%CTBCVfEkPuXVzTrOXx z(-0x#gOL8@QWWF!q#cO<)RYv(-Kq*0JL5mRjzzDHkdR)Txo43tT&n|S(ruwRzAm{&h@iYpa$^MS|a0g>QMlSXGuBB+#t{(Xdwgg^-(@DpGfopFPAS2pmR_U*g=x${Z1KDgdQsh%~7_CT*zlH(8e}kJ^y>!{ zB9@+Cj6XEc-#@>w5HM2qvaF20f-7mv$_QqyO+4^0baZuvMlhGSYjxVHYBt%DV#|Yg zS1&^pef~>HQ#9jq7kZ0&Z)>zVC}#TYo#jujrlPs4dnX=Ivd%V$+P+OM{riW5QUS($0_QBH5dx@D4%Q%zDD@MTgAqO8%*I(f)F%-vr}sr9~x2!p{uGnXDj3_rUN zJN(Wx98kjsK3wk8bN%?(H2l7F>$4XxW=H)>HuFI<8M2;Kk-14)=M%j}L%lPJNQRSx z!|e?a#Zop?d2aZD>A=R6u(pPV6$U&%&cYCdwA9rT7EU^~LTUASYl3r!w4^JBtxb)A z;iTAjhlGUiwl@K_&@25#VrH_AX0{qm#R-1#hZQFaZE}lpmT%s^4O`3OUu7&u#{(x{l0`^^yuIDjYEXbM)qYGIDb2 zJjwfMvBEX}*hqQ@hp~uOgta^4T`IR}ycG7Od{dPsChHB3P`f$kDkdrlQ#awa0@HP^ z^5;y)9u6EQ>CP3=>2#)tpvzEq9yI+OV9ke9x10Qi2y<QuKw+%j~jDsc6sM2J({BB?6eT|qzke8aepgW1GvfmJZP43{0Y(|^Q5~=#SKvG zKEeI^f#d99qSuu|Yu~TNYihM^amcyo^ zGLa_E&dznAt4_sNk?Yg%0Din%%_-hUoS2NXj7;0L<-V6<(wgR~(2$i!#ffsD=v^KQ z=Y+3aF3kD$j?{Bu1HX=kD)P`!Ys&cuW)>s}K@s^fRAM)9L~Nqelic?-PuI(o>g|>0 zqWsDxM_OaifF^Pg7&3!S@6I()0-74s>oL5dZ4-Y;{*i-6S84({$zbIFjxs%L6;*rbM8 zK9BpUN6s)jc$=J*QCe1Zi#kl?a5zMB3Yk>xRvkFO0b9e+VdKbnVR(D$WF(`jAEDpd zfM(s3P%DHyMoi3*ZMB?{a5T-_aNI7eDcTV&*08{48l$5R_<-0ZTp?20a&s ztDArl#s5%f-pv=r`Pqi7^r_7a)0aJ(MxD+Ce{8?Mn-n;P!19_uTJaMW>*;==#P!6K zU=}u3?rF^~64SGZvH)0TP)fNB{%kZaelt3Hy}#P0m81JS-O@$qEiGtJok?_2lvZ+TJ?l=~=Cst&v5<&JDPQI^PWtJ>PTRdXs(eLV*DKC zehUtsPV~SZ1H!UM=uyK1R#+3^Dsw5!AhRhAL|@5nDQN-Cg9JHHp$}oQ=~3H_$J-QT z@bB45iT&(y?Z!3ZV3?aM2S3GzA24#OA_QV|+j)+cdJuwFa5!OjxDY(t*9>+wY=a5$ z7T+^ivxcfkOqk>!JoazXeRuHzMTq@^`Pt-moa}5m!la3OwW&Sk(C;Mjdp_7Jo&$pZ zwRk(>o2TJRUk?R}A5VOHBl-N|SGNPpfna}I{youugy6r#teqKlm;v$oOO5+FaA_2< MfZM_dCfDx%3-f=IU;qFB diff --git a/testing/resources/embedder_tests/bug_535730401_skia_mac.png b/testing/resources/embedder_tests/bug_535730401_skia_mac.png deleted file mode 100644 index 9c22e2783fa172cfb3240dfe769ce82775afc6ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2175 zcmdVcX*Ane8vyXoYD>qAo}y=LbBbz_>IhMNRf{9FYwQ_IYpS%iX{nuBYp7kRrHGc1 z%v3Ciphgh;5>N-+JRmA6DJdxrOsbar-jadElh>h0?4df&s(-QE2m;1%fU>FMR=+Aaq@HqT2;Q!Rm&(GiA z{|OKn9S8)+1_cELhdv7l2?-4i4Fe()B7x}SsHmvu=;)Z3m{{OhdK?g+@eKGiGag8I zk(ikH97xVd0#b65fz-SdAT2)?NPm@;Wo2h)zXWnia)7+j z+}zx}yuADZOaV~zI~sUhUJSg!y)LPE1C&;lmX`hoVDM#F0tSP@VzGae*S!UB_2uQ| zIH0njqN1X*y0Hqtld1_#c%Y`401#VhYRN<*vF=@aJ;SrkIy*bNdq;YEd;5U?F$(a0ydM~tcn^G-8~_ICgTU~| zA%HqHJi?@oei{L2pGU{0X~6i**u?Dk(eiC4?=yW=R!T1O;m!_tsm`vuUY4&Ge zW@QGL4oadB~JY3U2V-d+Y)zOvcu6@a_L0akapz}ns_ zz}sH~)(?0*-un9b#>U3x=H}Mc*7o-H*RNmseE!bP&hGB+-rnB+{{F$iL0&U24+0U& zHZjz<4Vh$5?m39t$#kzaes?{`3OW7K*6?&=_-hS zA9VbnCf&1e{p7aMCP>`k9tVL*g^W9xZ-uK+1 z9Qv+~e@}BGN+WP+2`|?ktYEWyujeJx_4$HwL*$#Kf|URUBUgDi5?1ZAzbb=0#jJom z5-uQ2*IiQo*(rl}A=wRK{vY)DNmH4GmhZ0gi%}wFJNTB+o7d03C|I+wDHO68S-8H_oLl^3UrUE3*Xclu0>VeB}7XYzS+j z!{Wio>J<2wmlJ190~3?hzXaeOmKpFy^;hf5@IlEl`)4_g146mgyHu_fRy{)Tsn1PX z7{zU4oE0vu@al)+IUeFhgl(ZrY^_=Lox(+KEc_igcieYVGZ5DAk-kkmr;_yRu9TX% zR<|Vl_?L|MG2A{e-|2Vs>05M(AE$lYZ2D%tMIDD$lLb#ht4|$uz?r{8viwnNAZ|&~ zWQ$|r%gzTXs4!ElJr=jJu<#s{bAn=?Aa=38q%rt4=Stat%BXvgqP9|(w#-E`>_zBC zt*1w(MBQaA?a>IU%dozyLFU~Ib=ed4DJu`1M04csJ`QSbC&h;me0$5|cquTB{zlvS zX_i6b4qnCZ8Y-+Vv65FOUjr?yuys$d(zScrb=Q_cE1)8^eeQ{P=VVI9)esCG{YY8R zDkEjys#UIv!1ERQmMs#!t`pQRNkGdY&z!|t6!U;q~EvFFV_B%A1UW1_4b>S zDAUWrT9eiBVLbZ%+A2~Hsh2dc&IV>MFRx?{?+-5Q2&cynyLn4~-B4G9yn zB@Q*aOyfaH#;ixRAeHhhy1PiVxRc&0bwL26?=XjgM|bD{q!b>DC#s4arC88={pTXS zB3C48N`&T)Vt0C^J)ILFwW$b$2s>9&7WQ@zg?@uVN1JI4yl|{YvwLtSGc8bQjO{o% zEO%Fo&spuXvpu3+T({*WY(}8By}N z0WoRs@UgzK=#}|3ZssyHLpqYEO&bA^t>Q7&tr!f3VVJ&)qE085&#JS{a_2pDU34F$ zDqZz1TGMMH?rQG7#$Y^JV&F!9eq3?V^-sr?kvyPWK32_r$z_EF|EbiIAcbr74B=$W z8>lg<#ExJ-9vx~?_-D-B#@{|l;(U;F?7 diff --git a/testing/resources/embedder_tests/bug_535730401_skia_win.png b/testing/resources/embedder_tests/bug_535730401_skia_win.png deleted file mode 100644 index ef7d6b3fc1db761f006fa30f20d87a9550cb64bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1176 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAT=StC&U#<>+9>gySsaPd;9wO z1_T6zN2WwXM5L#u=jG)Ump0Vb*Eaz{OMh2aS9f=JPv6YGzP_o`7tNYAYuA+Z``(29skKa9e@%j17FRxy`dIJRSet!D$|J%23|NsBbjhU6sz`%Ui)5S5Q;?~>Sxy85K zMA!n3nux>%#x$+6+PFZ~L6Zrna`(G+4HE5XpEOq?Ms!WdaG{k2z|Aw0rV%M~t)Lz?G zXc@CFf|psx|HB3rNGJ(G0?!*7rj3xGX1T`S{q^+x4g0L}|2K#pN;I&jd0990f0R(z zxh#W-TEW#k3-``Gd`jZ#o-^#97io3B+ps75wE5~+XJ2)QdPQiyUC_J!-G@B6XP@7g z@vrVz+>`A;_3LM@up-UiyCuAmwS4_AUp&^bk?Sj{Ognpa&7H!Ni?a8{c=WfQxn|e; z?QUgS>!y~eyFcu(6bn6;HGkf%*!W(C)&HQWZ`Sps*jAU&y!GewV zeG_e0ud&+L`)}SlgQkH61LH?mp%l^C`^$2!wJb3 zsv8pa*6Hj&50QiB9f%Yp(jiG;jWiEj{lQ=Feu{I;sU_bGdF=@-Vi-JK{an^LB{Ts5 DP!lOc diff --git a/testing/resources/embedder_tests/focused_text_form_with_abc.dump.txt b/testing/resources/embedder_tests/focused_text_form_with_abc.dump.txt new file mode 100644 index 0000000000..31f026e580 --- /dev/null +++ b/testing/resources/embedder_tests/focused_text_form_with_abc.dump.txt @@ -0,0 +1,14 @@ +SaveState +SetBaseClip [0,0,300,300] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,300.0000) line(0.0000,0.0000) line(300.0000,0.0000) line(300.0000,300.0000) line(0.0000,300.0000,close)] +SaveState +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,150.0000] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(7.3320,0.0000)) (idx=86,u=U+0073,origin=(14.0040,0.0000)) (idx=87,u=U+0074,origin=(20.0040,0.0000)) (idx=3,u=U+0020,origin=(23.3400,0.0000)) (idx=41,u=U+0046,origin=(26.6760,0.0000)) (idx=82,u=U+006F,origin=(34.0080,0.0000)) (idx=85,u=U+0072,origin=(40.6800,0.0000)) (idx=80,u=U+006D,origin=(44.6760,0.0000))] +RestoreState +RestoreState +FillRect [101,171,199,199] color=0x00000000 +DrawPath fill=0x00000000 stroke=0x00000000 rule=even-odd stroke_state=[none] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,200.0000] points=[move(0.0000,0.0000) line(0.0000,30.0000) line(100.0000,30.0000) line(100.0000,0.0000) line(0.0000,0.0000,close) move(1.0000,1.0000) line(1.0000,29.0000) line(99.0000,29.0000) line(99.0000,1.0000) line(1.0000,1.0000,close)] +SaveState +SetClip_PathFill rule=winding matrix=none points=[move(101.0000,171.0000) line(101.0000,199.0000) line(199.0000,199.0000) line(199.0000,171.0000) line(101.0000,171.0000,close)] +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,101.0000,189.1640] glyphs=[(idx=36,u=U+0041,origin=(0.0000,0.0000)) (idx=37,u=U+0042,origin=(8.0040,0.0000)) (idx=38,u=U+0043,origin=(16.0080,0.0000))] +RestoreState +DrawPath fill=0x00000000 stroke=0xff000000 rule=even-odd stroke_state=[width=0.4000 cap=butt join=miter miter=10.0000] matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,200.0000] points=[move(25.8720,8.3040) line(25.8720,21.6960)] diff --git a/testing/resources/embedder_tests/focused_text_form_with_abc_agg.png b/testing/resources/embedder_tests/focused_text_form_with_abc_agg.png deleted file mode 100644 index 12f8afa3a69e7a56509a4702f85362e4adc6d97b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2131 zcmc(hdpy(oAIHi0Im1~RnoN>aC=$sfEGO60VI3W}VNwoCwp?f(LC0M zBF)ZhVhz7cV{_~LP#nyq$bB^1FuS;(@A>=p-|z8zJo@AL&-?Lszdp~$`}NPK;9`I; zSR1CTrltn=JLeUsrlxNFH=td>L~d#XS5pJQ{JhTokTJUSF)RM@yh+RQwu7VaSi+_0 z#315ZgGf$KRnQB&fepm?+$q}|Bb*rY_0*KA%WSlCbO4HVSbW8+E@vL=dm2<>P8^Eu zjqOgz?>Ijdd1_|=2NtFG_n@XQ(m&kGxZ|s(3Jxzzxsp}t*%F6QM-JE@P|x4v1^SY} zzw!coSs=UMU;P&=4!@q8dH>9FOkAHJU|NMR-Bu8Vg@p~+iJT40WaG=1?<=5YiuBdF z9@-_UeBn=OcmpOWDJgOEl~$+cgWZVCm6_bt<+{2$nN0R46*-ZaywG1cNDq;Wu;R+j z(`YmxQdZ^N<>Z_)_Z>Z$;fNj2o+te~W&V+gYueH%TTl~4!1stmA}xLMn3xzG#4x}n zyuLbTYdvMI`*fCER065TPHgvAUQlf6KN|#62}bs@?Z51;^&^wXO<4+YcXzk#afM{U z6wO38yL`x=?=6{}0z{FeZmQwht8YvoXYdf{-o5O^u{4>m&)5kg0{kqg9F7}@TvTM> z62`tBE zlWW4hLj(KpKK!I}HqX(4f&Jy)h3_*PlYv~|hO0~YQd*(yVY?syC{ikw#a0dpL)C!S zhI~m!@XbEkrzrOIXbq#Gs%UrBQxJbGx(LiHA`+p{+TYCmVJBnGg}(22aRsP2B{|t6 zga1I65Ukx<;e*%ydj4G*($7yzb>E8rwYMdYnyS}JIc;wZdspHbf}&MdTX#1PhevNT z#Jv4i9@y9h^-6daGS1o$z6OXha(A|C$+*^iym3|>5`=BbhrkWY6a_aw4>6uGZR>c; zzaH|P>mjGBR%X{e3nas}hoFPXfVj!xoAB0~JC~>d_ouUV4QfK)ms(xjQq(z8LFvG1U{7FAZ;6pQLLAmC_wP zZPf{j<7|#gQTe?17wF50tg>ii!hwHoZrpG@Az&d$=Ll2woShA&NGN5!ZGx$Rk`v z8^{$98jj*#G*v3#$UoinOZo2$N%5A}e&f@L@9Q6413$w@UpvV6YDRi<66w)RSHs?Q>)6Hyw~ACJykG<}9fm&VrRrHkvorT=`! zw0M)I8^57OQ=G`^o7)a3dC6FCcZSSK6PB40b~rDmt9}AlL9VQ<)YHWWv=UmE<7wcwf`yH9MY?f=Ua_PcXznQMtCcl0kdcNkv?Hhl-TngW2 z7ao7@M`37gbzySstj(+QePi#$m#!-Rsebq2@;esSK29?CH`S5NoVD?9PTH}3{)f93 z`>)f>TeI%ezklBf{xyHOcTmE=ZDa0^1mB?J(N7KKxN2wqPCm1y=jYG0A2*j2CYvtT zn%ws^&g=Z`nvYsxyHsC(;9i~d$5!Ut8t)Be$18q6|2TVgxAf~?>;L~Izg|=KRqNUf zvpaFJk0%ybZO)W=z3kDkSDe3-e?R_teg4_!;rq+fzW5(_#mBB^A3U|$^q<+CuxaZu z`=85sgs+i0p+Ea};DKG`Ikm6fuy*g0Xgy_P*j4&rTGIZ5{Qu3$-fP`io%C(j(mU(* zmfDpka6%$i2ol$-kf`^DB!FrE9!KQYb7tSlt&zXBrUO$YX5xoy-LLPY3HMAG~VfaH=DET z*Q{g5R7)4%E?BYlOH8^2bM~sL!`-^NXCMA}G1Js$``hUkW}W%BXCLD=`|8Tb#F~uL ztrv`MY}YM0zN~BAX$ec0OE`YjKusPUQb} zVe*&EbD-XZ<^xD>h=62{4J?pUk2jns(|C>dR{Tn9Uz@kQrtd+8gr}>Y%Q~loCIG&o B`JMm( diff --git a/testing/resources/embedder_tests/focused_text_form_with_abc_skia_linux.png b/testing/resources/embedder_tests/focused_text_form_with_abc_skia_linux.png deleted file mode 100644 index fcc0387a1fc8289631df840a1483d6cbbc99f144..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 970 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4xj)-jM&AM3=GT@JzX3_DsH{K<(&~yE^^>u z_kwL_XC&kI@;C(mLmPx|y%tUm4C8@qG1-}Tfu_m*)oMQlho z*u=`sr~_uSGKhg0P7K^&hGGLNm?3Zgs0Jv)0ah%g!vfJIHc;B{#jTm9qI>^+QgPKh zpZZAV)q8er{=eVondLQiwd{m7r#BnTFFUe0)pX{zM^{u{Y8|$^GGS(+;jQqxPj|0f zUHiVKa#`J%dy0LgZ`=15KbC)W)0Geq8nS!m(FAiF_{ax&yVV zfBRo+ds=&ZckE5o+6Zl>w7*jIp}e_k-pxwa-*-3r?j8B;@N5@F&6Mefs&;Ocs(esn%ROIPR(x%75;Wye)H;8;$n-J{))MI+2Hzw%$;1P zrEPRT(FTkX2)Tg;5@DQ>_!C-lu<7bQ>owQ&ZrVjKUk&-y|H9sL(v>qig+8v?o9Obk zNiTxAY++%QJLhWaPphA~ty%kjZN=l`&z5drdv#mazW%R_wx7w7wGY$pwux2;)o)+^ zF0re${Gs_r@4a(FcRtP)Jk7t{T6<=RgHn)F0wsG5>Hq(e^Ncuzb9VD@;Lej1`BrQ&ZCQZD-LaIi#%>PVk X>ob-KFR=yYRt5%7S3j3^P6pv$`KP?}*RPcCLCJqiPF1>Jx)o%5_w(v)ciIBaw#&=)^=;g8 zDPC*e1|u2f{iYkZR==Ja^u=fCL-F17?LS@GcH?KL`^%Ks$zSb^%PpR*K3be!eT?sT z_4Ml->-rWJTU&?U>-cNj{^;=f#|uwh-*sF1by`hvrkS0jX3sP00xPlb?GHQmoP4OW zG(Wk_;J?HhkCi0~b33D=lWQd-vG}R?djtyP|hG-=E&CyLj(wnoc{=5``c^pzOQR%?%2Wj zdiRWox}6ctTk8&lZ+0@9pjRfo>0WD9_?%k><~9|e$DQ)=JE@t<(VIo z{=VkQGutUucNID6wB-QHvC&t~4<5W4*Fv9*U*%4lo5Jv?4w;=SSB?Y?u#$9HXe z9`ShdeU;O5mwo-QD{Hx( z4X6Ive16*boSU!mZY+8fkZdzAwzI?O{>dp}-^yIJ{oa+kUl)r%mk|Q`FDO`vu8oxGt6OWIL;{15w#A{H7_jL7hS?83{1OPAg+ExGn diff --git a/testing/resources/embedder_tests/focused_text_form_with_abc_skia_win.png b/testing/resources/embedder_tests/focused_text_form_with_abc_skia_win.png deleted file mode 100644 index a244278c16ec967e9126b1813166b548e5010bac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 775 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4xj)-jM&AM3=B-?JY5_^DsH{KrkHmpK&0*B z?#1tvn02Oxa%q?wzh?7UyQ+J|^u(2{_ZmAZXQtYG(Vx*d%QJn^0xjQj?z}p(cYoho z{o<%7Q^baZgH5d5j5=UOD}xxA;l#iVW+*nWf*Aq_fNFpu9AL#_IxG-fVgsf9U;LVN zt5(hXv&wUlPH3pqJOIBuG3d!x?ux!;WBR*3<=is|Rru&N5 zq@4?tkYLgR;8@c_5H5p{w_W#*LPCh%vVP~zc?ecT+cH%c)E}CC13vg z_jRvvrkx79`m|`%F-6bKK8Gclw5OM}$lo|FmACEqnXhj5qD8tloGY z0}>n7ZQJ&C)|>CyM%#|}wA;?)pPvw$E%W?e&(=E2b>*u~_uRbqu6p-;_0{L^$R*y* zc{jPvZf@jT!E2kphKByFN_Q%$IlR{a3p>yY1Ise%9ptTdK;DaIlG$TTF*#1BAg80bwxefEld} zVqk_715gc6M6m&+IAVjq0kE!!fztjfe`DKxbE0C-^c4=ja_!pOcGG3|EX|b`eZSFnt%hfNy42)9H#ObuU0g0Nig9r% zk-vHGkFM3b`8m~hE?%lw{`P7?zO4( zC*Gyf@@Z*ub{0GT-I=xP(Xp(!S>4O0-n{JnJ1OBs<aw^SEWXTTtdu!|K+vV$}`_^sRJ<~UH z*3DUUaW%%bx}~-GuGYMI{aU{3M?u=Hm4a(rcXoJuUoX}5<_-JIvm5G??yh>%HU0Sh zxSg^u&$XqC-V9u`!|r)(%-UCtU%6jbKkk{eQvLGnrKeY&p1(&w`i5bb>4v3i)@?Cu zHC@)Pzt82!_v!1o1plt*-d|Y8w`21j>kTZBXy$~(x)3B0s6x_&HzZ|DgQgfrx`}|K fg8|WaZU0O56Xl0QTSGMqKpDo<)z4*}Q$iB}#o2Mt diff --git a/testing/resources/embedder_tests/text_form_no_highlight_agg_mac.png b/testing/resources/embedder_tests/text_form_no_highlight_agg_mac.png deleted file mode 100644 index 4b9c30c6f473198aa45d1ae868308d1467813d06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 861 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4xj)-jM&AMK#H+A$lZxy-8q?;3=GWTo-U3d z6}R4Azn|S(D0ATB@p-+x&U0r(r9V#cp5%1-Nt*d@?v$tJlERByrkr^fAnfJ6v*775 z-k*hOi+3okUbsX+IQnMqACKkRPHy~Mdam#9u447M*MC3y`SI_)y{~S6u3WTWzn&8V zx0p`Eh6Ke1Rxm^0Kogk3k#G>qVA%j+FagzoL>NJe4>q+jfOQ=lDDBt&cW<@rJALX= zMajXW{A~q$r^NR^X5Nq{eLh8NeX7w;fuhaX_Tv5`dE(MWKh+NZS^KkJwUTEw+o$QP zUu(~bZ(n)t*R8&l%QSv2YS_APNBz!qNw+s&DBbX};`_w8Q)SI3^S-=vY}T4rvYFXj zwI?5LkIv_HliySvv0iMh^u40P?mKV0bgapwwQ z(f-8J=zae_uXe7G>0M&hI^mXJ(P{k_>&{EZUUg-E+IvRMTPOR!UGr3nsrfH5ygA|* zFT66(Cajtx`+aM>wzu@_H@ochZ#M1{HjX%&d?Q%=(B&7gS?^`8bzM4ECG@rR%ep%= z5ATe5{qp<88#ZeWzWCSgd{Sr4&h-yZo^q+Rs<|^M;_@fm?UkAJjM>SB`>Q=m-!^Bi zxUw&Ejr(e^+NS?sms*sIK3g>*a>LZWIT~MgGkZfKb{aIoA<-TINd+5NAgO~B65B$M j$XA7=g#pp{cX1uFq}N&@;aSY`pnT)$>gTe~DWM4fAv|sZ diff --git a/testing/resources/embedder_tests/text_form_no_highlight_skia_linux.png b/testing/resources/embedder_tests/text_form_no_highlight_skia_linux.png deleted file mode 100644 index 94ed1ced92b6a4280e83acff6259e97090eefc53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 764 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4xj)-jM&AM3=B+%JzX3_DsH{KcE0;ep~QiY z>f$EJ+qSC9sBHDCd)pY4ebvBgr-gz`^+Wp!-IET>>8Rd+eeK$@qcKw+?|PGZG-m1+ z%Qb;hw%wIAWEhQ+p@s6?0jF~ex3knvphLzu*_s>r9 zSL4>pX@4bOUyZ1|UsJcsAi(bKJ?V`XTE75zUTeUvhPK?hga@=+iYChxAp(C z*Df`Wqlo9a?7S1d2ztfrUt>{#ogn6yI8;x~o+ zw7;5%6+gIr{&LXUGW}~Ix|>DUKC)S})jIo0*z%3lrB#dWT3PSh^X~8T_=vNYCSSXH zvE}MtscB_*&Tn`3o@)GdP1wBBy=`9~7JW6mdKI;Vst00_D{U;qFB diff --git a/testing/resources/embedder_tests/text_form_no_highlight_skia_mac.png b/testing/resources/embedder_tests/text_form_no_highlight_skia_mac.png deleted file mode 100644 index 5b02ce7cd0b34f2d85aff7da122b89bb59ebf8f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4xj)-jM&AM3=B*^JY5_^DsH{KzBfBKP~yPD z@A4;RX$H6P@$t1f9E>#Tu;@ruT+GqM$7j`XjZ3sy#QxSr#pZz0fEJ~r2VXs6KiV|; znwMv$>yoZpi`t%5T)tw)%5FaK_n$W5yn8Rv+K~|p6vcz1|kkv=;MZHb- zdiz#iJA3ZexGS5EUB0$rZrLBL>9-A*ZF+ij-iz5juhma4O@5th_-S8r=!21s7tK{NjdZ(_u^yhZt$%{L_B}%_8jhQchXKS6|IsKTf+5XAj z&)oFdw{hRm%}>+r%+1tb@1g9xU%_edH0fN~G)R`M3Wn zE_^oIBhY&3@s(!N>5q-GH&5-=zH;mPxnHHnmu!6$^y)pI4mg5!A|NrhfdvwyoRA0> rg2cBfB>KG}iC`Kub_YV^*ZyCuUuw2+`OfHz2IU1$S3j3^P6|diCo6|NoqsCoF(^GCW-zLn>~)y{hZa>?p!|fm5VRb=gTTkw{KXm9GuY z4~H}&`yo&0Nn?q<^hkdwb5ku-2`epSOp8+I?jHwp9sFQ}gmZ-JO4X vRkP^fDvnsIxp7I+%%`6>x6%THYQL7=Smi3Cpz$IC7$ppzu6{1-oD!M<$Xezw diff --git a/testing/resources/embedder_tests/unfocused_text_form_with_abc.dump.txt b/testing/resources/embedder_tests/unfocused_text_form_with_abc.dump.txt new file mode 100644 index 0000000000..3d9dba8198 --- /dev/null +++ b/testing/resources/embedder_tests/unfocused_text_form_with_abc.dump.txt @@ -0,0 +1,11 @@ +SaveState +SetBaseClip [0,0,300,300] +SetClip_PathFill rule=winding matrix=none points=[move(0.0000,300.0000) line(0.0000,0.0000) line(300.0000,0.0000) line(300.0000,300.0000) line(0.0000,300.0000,close)] +SaveState +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,100.0000,150.0000] glyphs=[(idx=55,u=U+0054,origin=(0.0000,0.0000)) (idx=72,u=U+0065,origin=(7.3320,0.0000)) (idx=86,u=U+0073,origin=(14.0040,0.0000)) (idx=87,u=U+0074,origin=(20.0040,0.0000)) (idx=3,u=U+0020,origin=(23.3400,0.0000)) (idx=41,u=U+0046,origin=(26.6760,0.0000)) (idx=82,u=U+006F,origin=(34.0080,0.0000)) (idx=85,u=U+0072,origin=(40.6800,0.0000)) (idx=80,u=U+006D,origin=(44.6760,0.0000))] +RestoreState +RestoreState +SaveState +DrawDeviceText font="Arimo" size=12.0000 color=0xff000000 matrix=[1.0000,0.0000,0.0000,-1.0000,101.0000,189.1640] glyphs=[(idx=36,u=U+0041,origin=(0.0000,0.0000)) (idx=37,u=U+0042,origin=(8.0040,0.0000)) (idx=38,u=U+0043,origin=(16.0080,0.0000))] +RestoreState +FillRect [100,200,200,170] color=0x64dde4ff diff --git a/testing/resources/embedder_tests/unfocused_text_form_with_abc_agg.png b/testing/resources/embedder_tests/unfocused_text_form_with_abc_agg.png deleted file mode 100644 index f9b833c56d5ac48f969d0f261f687d9cd935489c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2162 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 diff --git a/testing/resources/embedder_tests/unfocused_text_form_with_abc_skia_linux.png b/testing/resources/embedder_tests/unfocused_text_form_with_abc_skia_linux.png deleted file mode 100644 index 048a59a4e0a55c4a98d7763af6be7a98ef773e18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1521 zcmc)KYgE#A7zc2??5H6+r7U#LJeG9|#5h}=bSfE0-kTbtL(vRe7b|m^X*$x><1L$} z)mcfIlqMDETp@}V5>qO(oOf!@%nROu5)#-i*~`7#i+#@dpY!~G=l8sL{@>^P^9}?N zVe4$yK_C#A?|ys;1Y&^v{FoYnlc3ufLMUJ1qKF&goKbt zq;MeOFquq_1Ss)808u|uD3mDb(dg)CDwP^@C?PgBHjZ}cFg=kLf0|CG#{)-xI&v)e z#HqBCiRTiNGLjff#+l4yASEjWNX*0sjG4@Q~NU<#KuT!n)sD>VbwU27ofy5XBF)H%K?+r^Cp6ee<3Z-po9oziP zdOTt8`aZ+##+X|ta2pyoU#_bziz;L?j}1`<6K>(Y$L%;~)oXL>`1`?iYR&mACWw#( z`eWRtF1cXEc@N*Mr|E2uudy`Q%$OU~miYzL#*nNp43KL@HpFJF@POgdb8ep4&X$1OvJoeN?kw#ojMEuFdP~j~Z()sY(5BE1 zoc8_*&wDcV6{ja>tG~qsb|~>##>vPC-Ns~d`=;Mpc|JmA+PEm(j!139JXFpa@k<#< z{vMByHH+Fy3*Iwr>2p~u_eb=U*f@KCEuy{JUhwtsAiO=0lM;`jsE(UT^ZaX;9IGlU z$F4Pu;S*!y8pN)w3u2zp-4BWiPR;9EI1lDiy-db*<-9^9|G(_Q-fAb0r? zBP^L_(=YStaNn7llt%1`CabtY^5te0&906dg?gCbkgo6vo$T$Ay%4FfBu)RUW|kwF z=j0CgSQKlVB2cg{Wc-22bH-}_5Af6h@? zXTJ^v0?~Ck?cfT5Y%$;Xc5VZibI<|cqqobpTU1&u+Y(SFy0{eb{n zKtKQn8;ZqZ1A&|2H-SGQgM)){z-_|qJ8^e_@c6K>Fgy^Q6cs~?j*gCri6IaOu>dh8 zE-sD;+@;)2cz6#;q$VUJB$8-JK=LCJi9{xo??1>)NlAH-nnj^dQUU7Ihd^2ml}b$m z9zCbgXqj1sSx<|zv$LNAFPM1+rTO{!1x4kB#T7+GMa2N4icY697z`FrTKf_xt1AO4 zxaF0+N}#&Fy1M$+UrjYNHEcG!meX3tZR2veJRXnF=hp*`-A&ECuUiDo&CM-9TVHEy zYg=1ed*?t$M@LszS9f=JFCY{P`bLFs#`*^*27sZ-!NI|yp`l?wH2oGBk%$2C%*g1h z7#N!yeJ33o8+!*#ER0VsP5|#^lfabxJut19k}ORFGs}|Ml^I}8IV)YA1LjpyVBy0& zu(-A$Q!fJYb(u^im&+9j#nRH!%F2pTsa#!MRjE{KYinw?dVPHz6T&_Lfou~yIsAAb zbYQk`D#Q(?&k?77i%N9wb>1%_;PgI6XwhJY&|2oOs+?083Blyji)TVDuGUvCwF$2E zqo|_1<59WCzOK0He|;or&xA74Hhn17ayk9Dl&$^C}dHdVqFNZx{R>)q`B#ctCa);Hw09{yE0Z7~ z3YWf;D)FL~YPOLl!;u9Mf-HnjL8VUF>5IX=hWOaIoUuH`Wn0#dU`dj;VZ@CsqDIB$kyuUcUvGtho02IxbDx zLM)ClYAWiW>jegp7bd$zc+Ys;Rnk#mqb1K9ms}2?F;KbU8CL5D=`7!>-1EcgS8Itq z9-YFI!qfOGcbH0!ZzT#=YTR$I@Xdbs^&bcQl~Bh1RPN>0wTbJ3$!Wa?MpIcBO)EMYs&1MD5J4Ke%qoHnYm>j z?)iq2gXZtHo3HEod>jIJ(yvBXYRi9{30hk-kbRn$Z>l*2XU#dJeLR!@(kQW)2ASIH V9ZTKCa{&K+h!f(RL&+&L;U6%jG+qDz diff --git a/testing/resources/embedder_tests/unfocused_text_form_with_abc_skia_win.png b/testing/resources/embedder_tests/unfocused_text_form_with_abc_skia_win.png deleted file mode 100644 index a99e0a47c8eaa5bc01e21c9eb7b80396dc153305..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 841 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAmtI@6XFV_y}iA|BUAG7@`_6v z8k_r?TKc=YyL*)q1Q^+SaxYVvpN0AzQxrS;ec*9jD!RrmFw{k-z{i-%EIpr4W&j%;ITl$^jETFjWbjR9N1r5BYy9?C(pNg z`67*ZWrcU=-aqiG!}RJ`k%;q#B?qsmu6U@uwN5DPI`3P~>|a~w%cI_vOp&THxsD_O6H`9%D#ib#*RzAaixc%P#HJAw!?VOO*pbClQY0${0o#dMR a^TNf8D?8(=_{D&Eg2B_(&t;ucLK6Uuv}v~h