| 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;
 | 
| +}
 | 
| 
 |