Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/doc/SkDocument_PDF.cpp

Issue 944643002: PDF: Now threadsafe! (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: formatting Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "SkDocument.h" 8 #include "SkDocument.h"
9 #include "SkPDFCanon.h"
9 #include "SkPDFDocument.h" 10 #include "SkPDFDocument.h"
10 #include "SkPDFDevice.h" 11 #include "SkPDFDevice.h"
11 12
12 class SkDocument_PDF : public SkDocument { 13 class SkDocument_PDF : public SkDocument {
13 public: 14 public:
14 SkDocument_PDF(SkWStream* stream, void (*doneProc)(SkWStream*,bool), 15 SkDocument_PDF(SkWStream* stream,
16 void (*doneProc)(SkWStream*, bool),
15 SkPicture::EncodeBitmap encoder, 17 SkPicture::EncodeBitmap encoder,
16 SkScalar rasterDpi) 18 SkScalar rasterDpi)
17 : SkDocument(stream, doneProc) 19 : SkDocument(stream, doneProc)
18 , fEncoder(encoder) 20 , fDoc(SkNEW(SkPDFDocument))
19 , fRasterDpi(rasterDpi) { 21 , fEncoder(encoder)
20 fDoc = SkNEW(SkPDFDocument); 22 , fRasterDpi(rasterDpi) {}
21 fCanvas = NULL;
22 fDevice = NULL;
23 }
24 23
25 virtual ~SkDocument_PDF() { 24 virtual ~SkDocument_PDF() {
26 // subclasses must call close() in their destructors 25 // subclasses must call close() in their destructors
27 this->close(); 26 this->close();
28 } 27 }
29 28
30 protected: 29 protected:
31 virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height, 30 virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height,
32 const SkRect& trimBox) SK_OVERRIDE { 31 const SkRect& trimBox) SK_OVERRIDE {
33 SkASSERT(NULL == fCanvas); 32 SkASSERT(!fCanvas.get());
34 SkASSERT(NULL == fDevice); 33 SkASSERT(!fDevice.get());
35 34
36 SkISize mediaBoxSize; 35 SkISize pageSize;
37 mediaBoxSize.set(SkScalarRoundToInt(width), SkScalarRoundToInt(height)); 36 pageSize.set(SkScalarRoundToInt(width), SkScalarRoundToInt(height));
38 37
39 fDevice = SkNEW_ARGS(SkPDFDevice, (mediaBoxSize, mediaBoxSize, SkMatrix: :I())); 38 fDevice.reset(SkPDFDevice::Create(pageSize, fRasterDpi, &fCanon));
40 if (fEncoder) { 39 if (fEncoder) {
41 fDevice->setDCTEncoder(fEncoder); 40 fDevice->setDCTEncoder(fEncoder);
42 } 41 }
43 if (fRasterDpi != 0) { 42 fCanvas.reset(SkNEW_ARGS(SkCanvas, (fDevice)));
44 fDevice->setRasterDpi(fRasterDpi);
45 }
46 fCanvas = SkNEW_ARGS(SkCanvas, (fDevice));
47 fCanvas->clipRect(trimBox); 43 fCanvas->clipRect(trimBox);
48 fCanvas->translate(trimBox.x(), trimBox.y()); 44 fCanvas->translate(trimBox.x(), trimBox.y());
49 return fCanvas; 45 return fCanvas.get();
50 } 46 }
51 47
52 void onEndPage() SK_OVERRIDE { 48 void onEndPage() SK_OVERRIDE {
53 SkASSERT(fCanvas); 49 SkASSERT(fCanvas.get());
54 SkASSERT(fDevice); 50 SkASSERT(fDevice.get());
55 51
56 fCanvas->flush(); 52 fCanvas->flush();
57 fDoc->appendPage(fDevice); 53 fDoc->appendPage(fDevice.get());
58 54
59 fCanvas->unref(); 55 fCanvas.reset(NULL);
60 fDevice->unref(); 56 fDevice.reset(NULL);
61
62 fCanvas = NULL;
63 fDevice = NULL;
64 } 57 }
65 58
66 bool onClose(SkWStream* stream) SK_OVERRIDE { 59 bool onClose(SkWStream* stream) SK_OVERRIDE {
67 SkASSERT(NULL == fCanvas); 60 SkASSERT(!fCanvas.get());
68 SkASSERT(NULL == fDevice); 61 SkASSERT(!fDevice.get());
69 62
70 bool success = fDoc->emitPDF(stream); 63 bool success = fDoc->emitPDF(stream);
71 SkDELETE(fDoc); 64 fDoc.free();
72 fDoc = NULL; 65 SkDEBUGCODE(fCanon.assertEmpty());
73 return success; 66 return success;
74 } 67 }
75 68
76 void onAbort() SK_OVERRIDE { 69 void onAbort() SK_OVERRIDE {
77 SkDELETE(fDoc); 70 fDoc.free();
78 fDoc = NULL; 71 SkDEBUGCODE(fCanon.assertEmpty());
79 } 72 }
80 73
81 private: 74 private:
82 SkPDFDocument* fDoc; 75 SkPDFCanon fCanon;
83 SkPDFDevice* fDevice; 76 SkAutoTDelete<SkPDFDocument> fDoc;
84 SkCanvas* fCanvas; 77 SkAutoTUnref<SkPDFDevice> fDevice;
78 SkAutoTUnref<SkCanvas> fCanvas;
85 SkPicture::EncodeBitmap fEncoder; 79 SkPicture::EncodeBitmap fEncoder;
86 SkScalar fRasterDpi; 80 SkScalar fRasterDpi;
87 }; 81 };
88 82
89 /////////////////////////////////////////////////////////////////////////////// 83 ///////////////////////////////////////////////////////////////////////////////
90 84
91 SkDocument* SkDocument::CreatePDF(SkWStream* stream, void (*done)(SkWStream*,boo l), 85 SkDocument* SkDocument::CreatePDF(SkWStream* stream, void (*done)(SkWStream*,boo l),
92 SkPicture::EncodeBitmap enc, 86 SkPicture::EncodeBitmap enc,
93 SkScalar dpi) { 87 SkScalar dpi) {
94 return stream ? SkNEW_ARGS(SkDocument_PDF, (stream, done, enc, dpi)) : NULL; 88 return stream ? SkNEW_ARGS(SkDocument_PDF, (stream, done, enc, dpi)) : NULL;
95 } 89 }
96 90
97 static void delete_wstream(SkWStream* stream, bool aborted) { 91 static void delete_wstream(SkWStream* stream, bool aborted) {
98 SkDELETE(stream); 92 SkDELETE(stream);
99 } 93 }
100 94
101 SkDocument* SkDocument::CreatePDF(const char path[], 95 SkDocument* SkDocument::CreatePDF(const char path[],
102 SkPicture::EncodeBitmap enc, 96 SkPicture::EncodeBitmap enc,
103 SkScalar dpi) { 97 SkScalar dpi) {
104 SkFILEWStream* stream = SkNEW_ARGS(SkFILEWStream, (path)); 98 SkFILEWStream* stream = SkNEW_ARGS(SkFILEWStream, (path));
105 if (!stream->isValid()) { 99 if (!stream->isValid()) {
106 SkDELETE(stream); 100 SkDELETE(stream);
107 return NULL; 101 return NULL;
108 } 102 }
109 return SkNEW_ARGS(SkDocument_PDF, (stream, delete_wstream, enc, dpi)); 103 return SkNEW_ARGS(SkDocument_PDF, (stream, delete_wstream, enc, dpi));
110 } 104 }
OLDNEW
« no previous file with comments | « gyp/pdf.gypi ('k') | src/pdf/SkPDFBitmap.h » ('j') | src/pdf/SkPDFDevice.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698