Index: src/utils/SkPDFRasterizer.cpp |
diff --git a/src/utils/SkPDFRasterizer.cpp b/src/utils/SkPDFRasterizer.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3fd2728a16a51add623abf2c8aee0183fd463c81 |
--- /dev/null |
+++ b/src/utils/SkPDFRasterizer.cpp |
@@ -0,0 +1,73 @@ |
+ |
+/* |
+ * Copyright 2013 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifdef SK_BUILD_FOR_WIN32 |
+#pragma warning(push) |
+#pragma warning(disable : 4530) |
+#endif |
+ |
+#include <poppler-document.h> |
+#include <poppler-image.h> |
+#include <poppler-page.h> |
+#include <poppler-page-renderer.h> |
+ |
+#include "SkPDFRasterizer.h" |
+#include "SkColorPriv.h" |
+ |
+bool SkPopplerRasterizePDF(SkStream* pdf, SkBitmap* output) { |
+ size_t size = pdf->getLength(); |
+ void* buffer = sk_malloc_throw(size); |
+ pdf->read(buffer, size); |
+ |
+ SkAutoTDelete<poppler::document> doc( |
+ poppler::document::load_from_raw_data((const char*)buffer, size)); |
+ if (!doc.get() || doc->is_locked()) { |
+ return false; |
+ } |
+ |
+ SkAutoTDelete<poppler::page> page(doc->create_page(0)); |
+ poppler::page_renderer renderer; |
+ poppler::image image = renderer.render_page(page.get()); |
+ |
+ if (!image.is_valid() || image.format() != poppler::image::format_argb32) { |
+ return false; |
+ } |
+ |
+ size_t width = image.width(), height = image.height(); |
+ size_t rowSize = image.bytes_per_row(); |
+ char *imgData = image.data(); |
+ |
+ SkBitmap bitmap; |
+ bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height); |
+ if (!bitmap.allocPixels()) { |
+ return false; |
+ } |
+ bitmap.eraseColor(SK_ColorWHITE); |
+ SkPMColor* bitmapPixels = (SkPMColor*)bitmap.getPixels(); |
+ |
+ // do pixel-by-pixel copy to deal with RGBA ordering conversions |
+ for (size_t y = 0; y < height; y++) { |
+ char *rowData = imgData; |
+ for (size_t x = 0; x < width; x++) { |
+ uint8_t a = rowData[3]; |
+ uint8_t r = rowData[2]; |
+ uint8_t g = rowData[1]; |
+ uint8_t b = rowData[0]; |
+ |
+ *bitmapPixels = SkPreMultiplyARGB(a, r, g, b); |
+ |
+ bitmapPixels++; |
+ rowData += 4; |
+ } |
+ imgData += rowSize; |
+ } |
+ |
+ output->swap(bitmap); |
+ |
+ return true; |
+} |