OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkPdfRenderer.h" | 8 #include "SkPdfRenderer.h" |
9 | 9 |
10 #include "SkBitmapDevice.h" | 10 #include "SkBitmapDevice.h" |
(...skipping 3069 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3080 // TODO(edisonn:) erase with white before draw? Right now the caller i
s responsible. | 3080 // TODO(edisonn:) erase with white before draw? Right now the caller i
s responsible. |
3081 // SkPaint paint; | 3081 // SkPaint paint; |
3082 // paint.setColor(SK_ColorWHITE); | 3082 // paint.setColor(SK_ColorWHITE); |
3083 // canvas->drawRect(rect, paint); | 3083 // canvas->drawRect(rect, paint); |
3084 | 3084 |
3085 | 3085 |
3086 canvas->flush(); | 3086 canvas->flush(); |
3087 return true; | 3087 return true; |
3088 } | 3088 } |
3089 | 3089 |
3090 bool SkPdfRenderer::load(const SkString inputFileName) { | 3090 SkPdfRenderer* SkPdfRenderer::CreateFromFile(const char* inputFileName) { |
3091 unload(); | 3091 // FIXME: SkPdfNativeDoc should have a similar Create function. |
3092 | 3092 SkPdfNativeDoc* pdfDoc = SkNEW_ARGS(SkPdfNativeDoc, (inputFileName)); |
3093 fPdfDoc = new SkPdfNativeDoc(inputFileName.c_str()); | 3093 if (pdfDoc->pages() == 0) { |
3094 if (fPdfDoc->pages() == 0) { | 3094 SkDELETE(pdfDoc); |
3095 delete fPdfDoc; | 3095 return NULL; |
3096 fPdfDoc = NULL; | |
3097 } | 3096 } |
3098 | 3097 |
3099 return fPdfDoc != NULL; | 3098 return SkNEW_ARGS(SkPdfRenderer, (pdfDoc)); |
3100 } | 3099 } |
3101 | 3100 |
3102 bool SkPdfRenderer::load(SkStream* stream) { | 3101 SkPdfRenderer* SkPdfRenderer::CreateFromStream(SkStream* stream) { |
3103 unload(); | |
3104 | |
3105 // TODO(edisonn): create static function that could return NULL if there are
errors | 3102 // TODO(edisonn): create static function that could return NULL if there are
errors |
3106 fPdfDoc = new SkPdfNativeDoc(stream); | 3103 SkPdfNativeDoc* pdfDoc = SkNEW_ARGS(SkPdfNativeDoc, (stream)); |
3107 if (fPdfDoc->pages() == 0) { | 3104 if (pdfDoc->pages() == 0) { |
3108 delete fPdfDoc; | 3105 SkDELETE(pdfDoc); |
3109 fPdfDoc = NULL; | 3106 return NULL; |
3110 } | 3107 } |
3111 | 3108 |
3112 return fPdfDoc != NULL; | 3109 return SkNEW_ARGS(SkPdfRenderer, (pdfDoc)); |
3113 } | 3110 } |
3114 | 3111 |
| 3112 SkPdfRenderer::SkPdfRenderer(SkPdfNativeDoc* doc) |
| 3113 :fPdfDoc(doc) { |
| 3114 } |
| 3115 |
| 3116 SkPdfRenderer::~SkPdfRenderer() { |
| 3117 SkDELETE(fPdfDoc); |
| 3118 } |
3115 | 3119 |
3116 int SkPdfRenderer::pages() const { | 3120 int SkPdfRenderer::pages() const { |
3117 return fPdfDoc != NULL ? fPdfDoc->pages() : 0; | 3121 SkASSERT(fPdfDoc != NULL); |
3118 } | 3122 return fPdfDoc->pages(); |
3119 | |
3120 void SkPdfRenderer::unload() { | |
3121 delete fPdfDoc; | |
3122 fPdfDoc = NULL; | |
3123 } | 3123 } |
3124 | 3124 |
3125 SkRect SkPdfRenderer::MediaBox(int page) const { | 3125 SkRect SkPdfRenderer::MediaBox(int page) const { |
3126 SkASSERT(fPdfDoc); | 3126 SkASSERT(fPdfDoc != NULL); |
3127 return fPdfDoc->MediaBox(page); | 3127 return fPdfDoc->MediaBox(page); |
3128 } | 3128 } |
3129 | 3129 |
3130 size_t SkPdfRenderer::bytesUsed() const { | 3130 size_t SkPdfRenderer::bytesUsed() const { |
3131 return fPdfDoc ? fPdfDoc->bytesUsed() : 0; | 3131 SkASSERT(fPdfDoc != NULL); |
| 3132 return fPdfDoc->bytesUsed(); |
3132 } | 3133 } |
3133 | 3134 |
3134 bool SkPDFNativeRenderToBitmap(SkStream* stream, | 3135 bool SkPDFNativeRenderToBitmap(SkStream* stream, |
3135 SkBitmap* output, | 3136 SkBitmap* output, |
3136 int page, | 3137 int page, |
3137 SkPdfContent content, | 3138 SkPdfContent unused, |
3138 double dpi) { | 3139 double dpi) { |
3139 SkASSERT(page >= 0); | 3140 SkASSERT(page >= 0); |
3140 SkPdfRenderer renderer; | 3141 SkPdfRenderer* renderer = SkPdfRenderer::CreateFromStream(stream); |
3141 renderer.load(stream); | 3142 if (NULL == renderer) { |
3142 if (!renderer.loaded() || page >= renderer.pages() || page < 0) { | |
3143 return false; | 3143 return false; |
3144 } | 3144 } |
3145 | 3145 |
3146 SkRect rect = renderer.MediaBox(page < 0 ? 0 :page); | 3146 SkRect rect = renderer->MediaBox(page < 0 ? 0 :page); |
3147 | 3147 |
3148 SkScalar width = SkScalarMul(rect.width(), SkDoubleToScalar(sqrt(dpi / 72.0
))); | 3148 SkScalar width = SkScalarMul(rect.width(), SkDoubleToScalar(dpi / 72.0)); |
3149 SkScalar height = SkScalarMul(rect.height(), SkDoubleToScalar(sqrt(dpi / 72
.0))); | 3149 SkScalar height = SkScalarMul(rect.height(), SkDoubleToScalar(dpi / 72.0)); |
3150 | 3150 |
3151 rect = SkRect::MakeWH(width, height); | 3151 rect = SkRect::MakeWH(width, height); |
3152 | 3152 |
3153 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei
ght)); | 3153 setup_bitmap(output, SkScalarCeilToInt(width), SkScalarCeilToInt(height)); |
3154 | 3154 |
3155 SkAutoTUnref<SkBaseDevice> device(SkNEW_ARGS(SkBitmapDevice, (*output))); | 3155 SkAutoTUnref<SkBaseDevice> device(SkNEW_ARGS(SkBitmapDevice, (*output))); |
3156 SkCanvas canvas(device); | 3156 SkCanvas canvas(device); |
3157 | 3157 |
3158 return renderer.renderPage(page, &canvas, rect); | 3158 return renderer->renderPage(page, &canvas, rect); |
3159 } | 3159 } |
OLD | NEW |