Index: tests/PDFDocumentTest.cpp |
diff --git a/tests/PDFDocumentTest.cpp b/tests/PDFDocumentTest.cpp |
index 04c3ede6aa4c595ae7ea6799c23e9d26b1f5d90a..c3a5f0e04165846749a4203861ad250396f94dd1 100644 |
--- a/tests/PDFDocumentTest.cpp |
+++ b/tests/PDFDocumentTest.cpp |
@@ -6,10 +6,12 @@ |
*/ |
#include "Test.h" |
+#include "Resources.h" |
#include "SkCanvas.h" |
#include "SkDocument.h" |
#include "SkOSFile.h" |
#include "SkStream.h" |
+#include "SkPixelSerializer.h" |
static void test_empty(skiatest::Reporter* reporter) { |
SkDynamicMemoryWStream stream; |
@@ -110,3 +112,45 @@ DEF_TEST(document_tests, reporter) { |
test_file(reporter); |
test_close(reporter); |
} |
+ |
+namespace { |
+class JPEGSerializer final : public SkPixelSerializer { |
+ bool onUseEncodedData(const void*, size_t) override { return true; } |
+ SkData* onEncode(const SkPixmap& pixmap) override { |
+ SkBitmap bm; |
+ return bm.installPixels(pixmap.info(), |
+ pixmap.writable_addr(), |
+ pixmap.rowBytes(), |
+ pixmap.ctable(), |
+ nullptr, nullptr) |
+ ? SkImageEncoder::EncodeData(bm, SkImageEncoder::kJPEG_Type, 85) |
+ : nullptr; |
+ } |
+}; |
+} // namespace |
+ |
+size_t count_bytes(const SkBitmap& bm, bool useDCT) { |
+ SkDynamicMemoryWStream stream; |
+ SkAutoTUnref<SkDocument> doc; |
+ if (useDCT) { |
+ SkAutoTUnref<SkPixelSerializer> serializer(new JPEGSerializer); |
+ doc.reset(SkDocument::CreatePDF( |
+ &stream, SK_ScalarDefaultRasterDPI, serializer)); |
+ } else { |
+ doc.reset(SkDocument::CreatePDF(&stream)); |
+ } |
+ SkCanvas* canvas = doc->beginPage(64, 64); |
+ canvas->drawBitmap(bm, 0, 0); |
+ doc->endPage(); |
+ doc->close(); |
+ return stream.bytesWritten(); |
+} |
+ |
+DEF_TEST(document_dct_encoder, r) { |
+ REQUIRE_PDF_DOCUMENT(document_dct_encoder, r); |
+ SkBitmap bm; |
+ if (GetResourceAsBitmap("mandrill_64.png", &bm)) { |
+ // Lossy encoding works better on photographs. |
+ REPORTER_ASSERT(r, count_bytes(bm, true) < count_bytes(bm, false)); |
+ } |
+} |