private:
SkPDFCanon fCanon;
- SkTDArray<SkPDFDevice*> fPageDevices;
+ SkTDArray<const SkPDFDevice*> fPageDevices;
SkAutoTUnref<SkCanvas> fCanvas;
SkScalar fRasterDpi;
};
, fContentSize(pageSize)
, fExistingClipRegion(SkIRect::MakeSize(pageSize))
, fAnnotations(NULL)
- , fResourceDict(NULL)
, fLastContentEntry(NULL)
, fLastMarginContentEntry(NULL)
, fDrawingArea(kContent_DrawingArea)
void SkPDFDevice::init() {
fAnnotations = NULL;
- fResourceDict = NULL;
fContentEntries.free();
fLastContentEntry = NULL;
fMarginContentEntries.free();
fFontResources.unrefAll();
fShaderResources.unrefAll();
SkSafeUnref(fAnnotations);
- SkSafeUnref(fResourceDict);
fNamedDestinations.deleteAll();
if (clearFontUsage) {
fDrawingArea = drawingArea;
}
-SkPDFResourceDict* SkPDFDevice::getResourceDict() {
- if (NULL == fResourceDict) {
- fResourceDict = SkNEW(SkPDFResourceDict);
-
- if (fGraphicStateResources.count()) {
- for (int i = 0; i < fGraphicStateResources.count(); i++) {
- fResourceDict->insertResourceAsReference(
- SkPDFResourceDict::kExtGState_ResourceType,
- i, fGraphicStateResources[i]);
- }
+SkPDFResourceDict* SkPDFDevice::createResourceDict() const {
+ SkAutoTUnref<SkPDFResourceDict> resourceDict(SkNEW(SkPDFResourceDict));
+ if (fGraphicStateResources.count()) {
+ for (int i = 0; i < fGraphicStateResources.count(); i++) {
+ resourceDict->insertResourceAsReference(
+ SkPDFResourceDict::kExtGState_ResourceType,
+ i, fGraphicStateResources[i]);
}
+ }
- if (fXObjectResources.count()) {
- for (int i = 0; i < fXObjectResources.count(); i++) {
- fResourceDict->insertResourceAsReference(
- SkPDFResourceDict::kXObject_ResourceType,
- i, fXObjectResources[i]);
- }
+ if (fXObjectResources.count()) {
+ for (int i = 0; i < fXObjectResources.count(); i++) {
+ resourceDict->insertResourceAsReference(
+ SkPDFResourceDict::kXObject_ResourceType,
+ i, fXObjectResources[i]);
}
+ }
- if (fFontResources.count()) {
- for (int i = 0; i < fFontResources.count(); i++) {
- fResourceDict->insertResourceAsReference(
- SkPDFResourceDict::kFont_ResourceType,
- i, fFontResources[i]);
- }
+ if (fFontResources.count()) {
+ for (int i = 0; i < fFontResources.count(); i++) {
+ resourceDict->insertResourceAsReference(
+ SkPDFResourceDict::kFont_ResourceType,
+ i, fFontResources[i]);
}
+ }
- if (fShaderResources.count()) {
- SkAutoTUnref<SkPDFDict> patterns(new SkPDFDict());
- for (int i = 0; i < fShaderResources.count(); i++) {
- fResourceDict->insertResourceAsReference(
- SkPDFResourceDict::kPattern_ResourceType,
- i, fShaderResources[i]);
- }
+ if (fShaderResources.count()) {
+ SkAutoTUnref<SkPDFDict> patterns(new SkPDFDict());
+ for (int i = 0; i < fShaderResources.count(); i++) {
+ resourceDict->insertResourceAsReference(
+ SkPDFResourceDict::kPattern_ResourceType,
+ i, fShaderResources[i]);
}
}
- return fResourceDict;
+ return resourceDict.detach();
}
const SkTDArray<SkPDFFont*>& SkPDFDevice::getFontResources() const {
SkNEW_ARGS(NamedDestination, (nameData, translatedPoint)));
}
-void SkPDFDevice::appendDestinations(SkPDFDict* dict, SkPDFObject* page) {
+void SkPDFDevice::appendDestinations(SkPDFDict* dict, SkPDFObject* page) const {
int nDest = fNamedDestinations.count();
for (int i = 0; i < nDest; i++) {
NamedDestination* dest = fNamedDestinations[i];
class SkPDFShader;
class SkPDFStream;
class SkRRect;
-template <typename T> class SkTSet;
// Private classes.
struct ContentEntry;
// PDF specific methods.
- /** Returns the resource dictionary for this device.
+ /** Create the resource dictionary for this device.
*/
- SkPDFResourceDict* getResourceDict();
+ SkPDFResourceDict* createResourceDict() const;
/** Get the fonts used on this device.
*/
* @param dict Dictionary to add destinations to.
* @param page The PDF object representing the page for this device.
*/
- void appendDestinations(SkPDFDict* dict, SkPDFObject* page);
+ void appendDestinations(SkPDFDict* dict, SkPDFObject* page) const;
/** Returns a copy of the media box for this device. The caller is required
* to unref() this when it is finished.
SkClipStack fExistingClipStack;
SkRegion fExistingClipRegion;
SkPDFArray* fAnnotations;
- SkPDFResourceDict* fResourceDict;
SkTDArray<NamedDestination*> fNamedDestinations;
SkTDArray<SkPDFGraphicState*> fGraphicStateResources;
stream->writeText("\n%%EOF");
}
-bool SkPDFDocument::EmitPDF(const SkTDArray<SkPDFDevice*>& pageDevices,
+bool SkPDFDocument::EmitPDF(const SkTDArray<const SkPDFDevice*>& pageDevices,
SkWStream* stream) {
if (pageDevices.isEmpty()) {
return false;
* should be created using the same SkPDFCanon.
* @param SkWStream The writable output stream to send the PDF to.
*/
-bool EmitPDF(const SkTDArray<SkPDFDevice*>& pageDevices, SkWStream*);
+bool EmitPDF(const SkTDArray<const SkPDFDevice*>& pageDevices, SkWStream*);
/** Get the count of unique font types used in the given pages.
*/
// We don't want to keep around device because we'd have two copies
// of content, so reference or copy everything we need (content and
// resources).
- SkPDFResourceDict* resourceDict = device->getResourceDict();
+ SkAutoTUnref<SkPDFResourceDict> resourceDict(device->createResourceDict());
SkAutoTDelete<SkStreamAsset> content(device->content());
this->setData(content.get());
SkAutoTUnref<SkPDFArray> bboxArray(device->copyMediaBox());
- init(NULL, resourceDict, bboxArray);
+ this->init(NULL, resourceDict.get(), bboxArray);
// We invert the initial transform and apply that to the xobject so that
// it doesn't get applied twice. We can't just undo it because it's
#include "SkPDFPage.h"
#include "SkPDFResourceDict.h"
-SkPDFPage::SkPDFPage(SkPDFDevice* content)
+SkPDFPage::SkPDFPage(const SkPDFDevice* content)
: SkPDFDict("Page"),
fDevice(content) {
SkSafeRef(content);
const SkTSet<SkPDFObject*>& knownResourceObjects,
SkTSet<SkPDFObject*>* newResourceObjects) {
if (fContentStream.get() == NULL) {
- this->insert("Resources", fDevice->getResourceDict());
+ SkAutoTUnref<SkPDFResourceDict> deviceResourceDict(
+ fDevice->createResourceDict());
+ this->insert("Resources", deviceResourceDict.get());
SkSafeUnref(this->insert("MediaBox", fDevice->copyMediaBox()));
SkPDFArray* annots = fDevice->getAnnotations();
if (annots && annots->size() > 0) {
* have content on it yet.
* @param content The page content.
*/
- explicit SkPDFPage(SkPDFDevice* content);
+ explicit SkPDFPage(const SkPDFDevice* content);
~SkPDFPage();
/** Before a page and its contents can be sized and emitted, it must
private:
// Multiple pages may reference the content.
- SkAutoTUnref<SkPDFDevice> fDevice;
+ SkAutoTUnref<const SkPDFDevice> fDevice;
// Once the content is finalized, put it into a stream for output.
SkAutoTUnref<SkPDFStream> fContentStream;
SkNEW_ARGS(SkPDFImageShader, (autoState->detach()));
imageShader->setData(content.get());
+ SkAutoTUnref<SkPDFResourceDict> resourceDict(
+ patternDevice->createResourceDict());
populate_tiling_pattern_dict(imageShader, patternBBox,
- patternDevice->getResourceDict(), finalMatrix);
+ resourceDict.get(), finalMatrix);
imageShader->fShaderState->fImage.unlockPixels();