From 2a3377ce9a39d47d29c95d5db64690ad749d8c94 Mon Sep 17 00:00:00 2001 From: Henrique Nakashima Date: Thu, 16 Aug 2018 15:47:56 +0000 Subject: Optimize rendering of two dimensional barcodes: deduplicate regions. Reduce the logical size of the barcode by removing unnecessary region duplication. As far as I can tell, the line thickness is useless and the aspect ratio causes arbitrary changes in rounding, but ultimately the dimensions of a barcode are defined by its width and height, rather than by this ratio. The improvement with this CL is from ~580ms to ~390ms per barcode, so about 1.5x. Combined with https://pdfium-review.googlesource.com/c/pdfium/+/40010 the improvement is to ~15ms, which is about 39x. This also fixes the rendering of the barcode in the pixel and corpus tests. You can verify this pointing a barcode reader app at the screen. It does not however fix every case, as the unit test is still unreadable. Bug: 872907, pdfium:1135 Change-Id: Ic28e60f54719552cfe69ace7ebc3f730c338a129 Reviewed-on: https://pdfium-review.googlesource.com/40030 Commit-Queue: Henrique Nakashima Reviewed-by: Lei Zhang Reviewed-by: Ryan Harrison --- DEPS | 2 +- fxbarcode/pdf417/BC_PDF417Writer.cpp | 9 +++------ .../xfa_specific/barcode_test_expected.pdf.0.png | Bin 10547 -> 10717 bytes xfa/fwl/cfx_barcode_unittest.cpp | 2 +- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/DEPS b/DEPS index 20e7e51f7c..b61a144406 100644 --- a/DEPS +++ b/DEPS @@ -29,7 +29,7 @@ vars = { 'jinja2_revision': '45571de473282bd1d8b63a8dfcb1fd268d0635d2', 'jpeg_turbo_revision': '7260e4d8b8e1e40b17f03fafdf1cd83296900f76', 'markupsafe_revision': '8f45f5cfa0009d2a70589bcda0349b8cb2b72783', - 'pdfium_tests_revision': '62a57ad4d90cf1f68f41c24da7ea413750336235', + 'pdfium_tests_revision': '0121d24bf42e437bea80dffe251cccf013482551', 'skia_revision': '588f879677d4f36e16a42dd96876534f104c2e2f', 'tools_memory_revision': 'f7b00daf4df7f6c469f5fbc68d7f40f6bd15d6e6', 'trace_event_revision': '211b3ed9d0481b4caddbee1322321b86a483ca1f', diff --git a/fxbarcode/pdf417/BC_PDF417Writer.cpp b/fxbarcode/pdf417/BC_PDF417Writer.cpp index 4fec974737..026c89a59d 100644 --- a/fxbarcode/pdf417/BC_PDF417Writer.cpp +++ b/fxbarcode/pdf417/BC_PDF417Writer.cpp @@ -63,15 +63,13 @@ uint8_t* CBC_PDF417Writer::Encode(const WideString& contents, if (!encoder.generateBarcodeLogic(contents, m_iCorrectLevel)) return nullptr; - int32_t lineThickness = 2; - int32_t aspectRatio = 4; CBC_BarcodeMatrix* barcodeMatrix = encoder.getBarcodeMatrix(); - std::vector originalScale = barcodeMatrix->getScaledMatrix( - lineThickness, aspectRatio * lineThickness); + std::vector originalScale = barcodeMatrix->getMatrix(); int32_t width = outWidth; int32_t height = outHeight; outWidth = barcodeMatrix->getWidth(); outHeight = barcodeMatrix->getHeight(); + bool rotated = false; if ((height > width) ^ (outWidth < outHeight)) { rotateArray(originalScale, outHeight, outWidth); @@ -84,8 +82,7 @@ uint8_t* CBC_PDF417Writer::Encode(const WideString& contents, int32_t scaleY = height / outHeight; int32_t scale = std::min(scaleX, scaleY); if (scale > 1) { - originalScale = barcodeMatrix->getScaledMatrix( - scale * lineThickness, scale * aspectRatio * lineThickness); + originalScale = barcodeMatrix->getScaledMatrix(scale); if (rotated) { rotateArray(originalScale, outHeight, outWidth); int32_t temp = outHeight; diff --git a/testing/resources/pixel/xfa_specific/barcode_test_expected.pdf.0.png b/testing/resources/pixel/xfa_specific/barcode_test_expected.pdf.0.png index 2e668afc9a..b56b826839 100644 Binary files a/testing/resources/pixel/xfa_specific/barcode_test_expected.pdf.0.png and b/testing/resources/pixel/xfa_specific/barcode_test_expected.pdf.0.png differ diff --git a/xfa/fwl/cfx_barcode_unittest.cpp b/xfa/fwl/cfx_barcode_unittest.cpp index 0c8a05fece..4b1dc059ce 100644 --- a/xfa/fwl/cfx_barcode_unittest.cpp +++ b/xfa/fwl/cfx_barcode_unittest.cpp @@ -125,7 +125,7 @@ TEST_F(BarcodeTest, Pdf417) { EXPECT_TRUE(Create(BC_PDF417)); EXPECT_TRUE(barcode()->Encode(L"clams")); RenderDevice(); - EXPECT_EQ("2bdb9b39f20c5763da6a0d7c7b1f6933", BitmapChecksum()); + EXPECT_EQ("3a154001167ff0b8511b72677dd4c5a4", BitmapChecksum()); } TEST_F(BarcodeTest, DataMatrix) { -- cgit v1.2.3