diff options
Diffstat (limited to 'include')
-rwxr-xr-x | include/pdf/SkBitSet.h | 78 | ||||
-rw-r--r-- | include/pdf/SkPDFCatalog.h | 137 | ||||
-rw-r--r-- | include/pdf/SkPDFDocument.h | 11 | ||||
-rw-r--r-- | include/pdf/SkPDFFont.h | 202 | ||||
-rw-r--r-- | include/pdf/SkPDFFormXObject.h | 48 | ||||
-rw-r--r-- | include/pdf/SkPDFGraphicState.h | 101 | ||||
-rw-r--r-- | include/pdf/SkPDFImage.h | 70 | ||||
-rw-r--r-- | include/pdf/SkPDFPage.h | 100 | ||||
-rw-r--r-- | include/pdf/SkPDFShader.h | 65 | ||||
-rw-r--r-- | include/pdf/SkPDFStream.h | 75 | ||||
-rw-r--r-- | include/pdf/SkPDFTypes.h | 403 | ||||
-rw-r--r-- | include/pdf/SkPDFUtils.h | 54 |
12 files changed, 7 insertions, 1337 deletions
diff --git a/include/pdf/SkBitSet.h b/include/pdf/SkBitSet.h deleted file mode 100755 index 484fc2aec2..0000000000 --- a/include/pdf/SkBitSet.h +++ /dev/null @@ -1,78 +0,0 @@ - -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - - -#ifndef SkBitSet_DEFINED -#define SkBitSet_DEFINED - -#include "SkTypes.h" -#include "SkTDArray.h" - -class SkBitSet { -public: - /** NumberOfBits must be greater than zero. - */ - explicit SkBitSet(int numberOfBits); - explicit SkBitSet(const SkBitSet& source); - - const SkBitSet& operator=(const SkBitSet& rhs); - bool operator==(const SkBitSet& rhs); - bool operator!=(const SkBitSet& rhs); - - /** Clear all data. - */ - void clearAll(); - - /** Set the value of the index-th bit. - */ - void setBit(int index, bool value); - - /** Test if bit index is set. - */ - bool isBitSet(int index) const; - - /** Or bits from source. false is returned if this doesn't have the same - * bit count as source. - */ - bool orBits(const SkBitSet& source); - - /** Export indices of set bits to T array. - */ - template<typename T> - void exportTo(SkTDArray<T>* array) const { - SkASSERT(array); - uint32_t* data = reinterpret_cast<uint32_t*>(fBitData.get()); - for (unsigned int i = 0; i < fDwordCount; ++i) { - uint32_t value = data[i]; - if (value) { // There are set bits - unsigned int index = i * 32; - for (unsigned int j = 0; j < 32; ++j) { - if (0x1 & (value >> j)) { - array->push(index + j); - } - } - } - } - } - -private: - SkAutoFree fBitData; - // Dword (32-bit) count of the bitset. - size_t fDwordCount; - size_t fBitCount; - - uint32_t* internalGet(int index) const { - SkASSERT((size_t)index < fBitCount); - size_t internalIndex = index / 32; - SkASSERT(internalIndex < fDwordCount); - return reinterpret_cast<uint32_t*>(fBitData.get()) + internalIndex; - } -}; - - -#endif diff --git a/include/pdf/SkPDFCatalog.h b/include/pdf/SkPDFCatalog.h deleted file mode 100644 index 68a244fab0..0000000000 --- a/include/pdf/SkPDFCatalog.h +++ /dev/null @@ -1,137 +0,0 @@ - -/* - * Copyright 2010 The Android Open Source Project - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - - -#ifndef SkPDFCatalog_DEFINED -#define SkPDFCatalog_DEFINED - -#include <sys/types.h> - -#include "SkPDFDocument.h" -#include "SkPDFTypes.h" -#include "SkRefCnt.h" -#include "SkTDArray.h" - -/** \class SkPDFCatalog - - The PDF catalog manages object numbers and file offsets. It is used - to create the PDF cross reference table. -*/ -class SK_API SkPDFCatalog { -public: - /** Create a PDF catalog. - */ - explicit SkPDFCatalog(SkPDFDocument::Flags flags); - ~SkPDFCatalog(); - - /** Add the passed object to the catalog. Refs obj. - * @param obj The object to add. - * @param onFirstPage Is the object on the first page. - * @return The obj argument is returned. - */ - SkPDFObject* addObject(SkPDFObject* obj, bool onFirstPage); - - /** Inform the catalog of the object's position in the final stream. - * The object should already have been added to the catalog. Returns - * the object's size. - * @param obj The object to add. - * @param offset The byte offset in the output stream of this object. - */ - size_t setFileOffset(SkPDFObject* obj, size_t offset); - - /** Output the object number for the passed object. - * @param obj The object of interest. - * @param stream The writable output stream to send the output to. - */ - void emitObjectNumber(SkWStream* stream, SkPDFObject* obj); - - /** Return the number of bytes that would be emitted for the passed - * object's object number. - * @param obj The object of interest - */ - size_t getObjectNumberSize(SkPDFObject* obj); - - /** Return the document flags in effect for this catalog/document. - */ - SkPDFDocument::Flags getDocumentFlags() const { return fDocumentFlags; } - - /** Output the cross reference table for objects in the catalog. - * Returns the total number of objects. - * @param stream The writable output stream to send the output to. - * @param firstPage If true, include first page objects only, otherwise - * include all objects not on the first page. - */ - int32_t emitXrefTable(SkWStream* stream, bool firstPage); - - /** Set substitute object for the passed object. - */ - void setSubstitute(SkPDFObject* original, SkPDFObject* substitute); - - /** Find and return any substitute object set for the passed object. If - * there is none, return the passed object. - */ - SkPDFObject* getSubstituteObject(SkPDFObject* object); - - /** Set file offsets for the resources of substitute objects. - * @param fileOffset Accumulated offset of current document. - * @param firstPage Indicate whether this is for the first page only. - * @return Total size of resources of substitute objects. - */ - off_t setSubstituteResourcesOffsets(off_t fileOffset, bool firstPage); - - /** Emit the resources of substitute objects. - */ - void emitSubstituteResources(SkWStream* stream, bool firstPage); - -private: - struct Rec { - Rec(SkPDFObject* object, bool onFirstPage) - : fObject(object), - fFileOffset(0), - fObjNumAssigned(false), - fOnFirstPage(onFirstPage) { - } - SkPDFObject* fObject; - off_t fFileOffset; - bool fObjNumAssigned; - bool fOnFirstPage; - }; - - struct SubstituteMapping { - SubstituteMapping(SkPDFObject* original, SkPDFObject* substitute) - : fOriginal(original), fSubstitute(substitute) { - } - SkPDFObject* fOriginal; - SkPDFObject* fSubstitute; - }; - - // TODO(vandebo): Make this a hash if it's a performance problem. - SkTDArray<struct Rec> fCatalog; - - // TODO(arthurhsu): Make this a hash if it's a performance problem. - SkTDArray<SubstituteMapping> fSubstituteMap; - SkTDArray<SkPDFObject*> fSubstituteResourcesFirstPage; - SkTDArray<SkPDFObject*> fSubstituteResourcesRemaining; - - // Number of objects on the first page. - uint32_t fFirstPageCount; - // Next object number to assign (on page > 1). - uint32_t fNextObjNum; - // Next object number to assign on the first page. - uint32_t fNextFirstPageObjNum; - - SkPDFDocument::Flags fDocumentFlags; - - int findObjectIndex(SkPDFObject* obj) const; - - int assignObjNum(SkPDFObject* obj); - - SkTDArray<SkPDFObject*>* getSubstituteList(bool firstPage); -}; - -#endif diff --git a/include/pdf/SkPDFDocument.h b/include/pdf/SkPDFDocument.h index c1c6fb4c64..1a4a51fa43 100644 --- a/include/pdf/SkPDFDocument.h +++ b/include/pdf/SkPDFDocument.h @@ -10,15 +10,17 @@ #ifndef SkPDFDocument_DEFINED #define SkPDFDocument_DEFINED -#include "SkPDFTypes.h" +#include "SkAdvancedTypefaceMetrics.h" #include "SkRefCnt.h" #include "SkTDArray.h" #include "SkTScopedPtr.h" class SkPDFCatalog; class SkPDFDevice; +class SkPDFDict; class SkPDFPage; -class SkWSteam; +class SkPDFObject; +class SkWStream; /** \class SkPDFDocument @@ -62,9 +64,10 @@ public: */ SK_API bool appendPage(SkPDFDevice* pdfDevice); - /** Get the list of pages in this document. + /** Get the count of unique font types used in the document. */ - SK_API const SkTDArray<SkPDFPage*>& getPages(); + SK_API void getCountOfFontTypes( + int counts[SkAdvancedTypefaceMetrics::kNotEmbeddable_Font + 1]) const; private: SkTScopedPtr<SkPDFCatalog> fCatalog; diff --git a/include/pdf/SkPDFFont.h b/include/pdf/SkPDFFont.h deleted file mode 100644 index 2ebdec73da..0000000000 --- a/include/pdf/SkPDFFont.h +++ /dev/null @@ -1,202 +0,0 @@ - -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - - -#ifndef SkPDFFont_DEFINED -#define SkPDFFont_DEFINED - -#include "SkAdvancedTypefaceMetrics.h" -#include "SkBitSet.h" -#include "SkPDFTypes.h" -#include "SkTDArray.h" -#include "SkThread.h" -#include "SkTypeface.h" - -class SkPaint; -class SkPDFCatalog; -class SkPDFFont; - -class SkPDFGlyphSet : public SkNoncopyable { -public: - SkPDFGlyphSet(); - - void set(const uint16_t* glyphIDs, int numGlyphs); - bool has(uint16_t glyphID) const; - void merge(const SkPDFGlyphSet& usage); - void exportTo(SkTDArray<uint32_t>* glyphIDs) const; - -private: - SkBitSet fBitSet; -}; - -class SkPDFGlyphSetMap : public SkNoncopyable { -public: - struct FontGlyphSetPair { - FontGlyphSetPair(SkPDFFont* font, SkPDFGlyphSet* glyphSet); - - SkPDFFont* fFont; - SkPDFGlyphSet* fGlyphSet; - }; - - SkPDFGlyphSetMap(); - ~SkPDFGlyphSetMap(); - - class F2BIter { - public: - explicit F2BIter(const SkPDFGlyphSetMap& map); - FontGlyphSetPair* next() const; - void reset(const SkPDFGlyphSetMap& map); - - private: - const SkTDArray<FontGlyphSetPair>* fMap; - mutable int fIndex; - }; - - void merge(const SkPDFGlyphSetMap& usage); - void reset(); - - void noteGlyphUsage(SkPDFFont* font, const uint16_t* glyphIDs, - int numGlyphs); - -private: - SkPDFGlyphSet* getGlyphSetForFont(SkPDFFont* font); - - SkTDArray<FontGlyphSetPair> fMap; -}; - - -/** \class SkPDFFont - A PDF Object class representing a font. The font may have resources - attached to it in order to embed the font. SkPDFFonts are canonicalized - so that resource deduplication will only include one copy of a font. - This class uses the same pattern as SkPDFGraphicState, a static weak - reference to each instantiated class. -*/ -class SkPDFFont : public SkPDFDict { -public: - SK_API virtual ~SkPDFFont(); - - SK_API virtual void getResources(SkTDArray<SkPDFObject*>* resourceList); - - /** Returns the typeface represented by this class. Returns NULL for the - * default typeface. - */ - SK_API SkTypeface* typeface(); - - /** Returns the font type represented in this font. For Type0 fonts, - * returns the type of the decendant font. - */ - SK_API virtual SkAdvancedTypefaceMetrics::FontType getType(); - - /** Returns true if this font encoding supports glyph IDs above 255. - */ - SK_API virtual bool multiByteGlyphs() const = 0; - - /** Return true if this font has an encoding for the passed glyph id. - */ - SK_API bool hasGlyph(uint16_t glyphID); - - /** Convert (in place) the input glyph IDs into the font encoding. If the - * font has more glyphs than can be encoded (like a type 1 font with more - * than 255 glyphs) this method only converts up to the first out of range - * glyph ID. - * @param glyphIDs The input text as glyph IDs. - * @param numGlyphs The number of input glyphs. - * @return Returns the number of glyphs consumed. - */ - SK_API size_t glyphsToPDFFontEncoding(uint16_t* glyphIDs, size_t numGlyphs); - - /** Get the font resource for the passed typeface and glyphID. The - * reference count of the object is incremented and it is the caller's - * responsibility to unreference it when done. This is needed to - * accommodate the weak reference pattern used when the returned object - * is new and has no other references. - * @param typeface The typeface to find. - * @param glyphID Specify which section of a large font is of interest. - */ - SK_API static SkPDFFont* GetFontResource(SkTypeface* typeface, - uint16_t glyphID); - - /** Subset the font based on usage set. Returns a SkPDFFont instance with - * subset. - * @param usage Glyph subset requested. - * @return NULL if font does not support subsetting, a new instance - * of SkPDFFont otherwise. - */ - SK_API virtual SkPDFFont* getFontSubset(const SkPDFGlyphSet* usage); - -protected: - // Common constructor to handle common members. - SkPDFFont(SkAdvancedTypefaceMetrics* fontInfo, SkTypeface* typeface, - uint16_t glyphID, bool descendantFont); - - // Accessors for subclass. - SkAdvancedTypefaceMetrics* fontInfo(); - void setFontInfo(SkAdvancedTypefaceMetrics* info); - uint16_t firstGlyphID() const; - uint16_t lastGlyphID() const; - void setLastGlyphID(uint16_t glyphID); - - // Add object to resource list. - void addResource(SkPDFObject* object); - - // Accessors for FontDescriptor associated with this object. - SkPDFDict* getFontDescriptor(); - void setFontDescriptor(SkPDFDict* descriptor); - - // Add common entries to FontDescriptor. - bool addCommonFontDescriptorEntries(int16_t defaultWidth); - - /** Set fFirstGlyphID and fLastGlyphID to span at most 255 glyphs, - * including the passed glyphID. - */ - void adjustGlyphRangeForSingleByteEncoding(int16_t glyphID); - - // Generate ToUnicode table according to glyph usage subset. - // If subset is NULL, all available glyph ids will be used. - void populateToUnicodeTable(const SkPDFGlyphSet* subset); - - // Create instances of derived types based on fontInfo. - static SkPDFFont* Create(SkAdvancedTypefaceMetrics* fontInfo, - SkTypeface* typeface, uint16_t glyphID, - SkPDFDict* fontDescriptor); - - static bool Find(uint32_t fontID, uint16_t glyphID, int* index); - -private: - class FontRec { - public: - SkPDFFont* fFont; - uint32_t fFontID; - uint16_t fGlyphID; - - // A fGlyphID of 0 with no fFont always matches. - bool operator==(const FontRec& b) const; - FontRec(SkPDFFont* font, uint32_t fontID, uint16_t fGlyphID); - }; - - SkRefPtr<SkTypeface> fTypeface; - - // The glyph IDs accessible with this font. For Type1 (non CID) fonts, - // this will be a subset if the font has more than 255 glyphs. - uint16_t fFirstGlyphID; - uint16_t fLastGlyphID; - // The font info is only kept around after construction for large - // Type1 (non CID) fonts that need multiple "fonts" to access all glyphs. - SkRefPtr<SkAdvancedTypefaceMetrics> fFontInfo; - SkTDArray<SkPDFObject*> fResources; - SkRefPtr<SkPDFDict> fDescriptor; - - SkAdvancedTypefaceMetrics::FontType fFontType; - - // This should be made a hash table if performance is a problem. - static SkTDArray<FontRec>& CanonicalFonts(); - static SkBaseMutex& CanonicalFontsMutex(); -}; - -#endif diff --git a/include/pdf/SkPDFFormXObject.h b/include/pdf/SkPDFFormXObject.h deleted file mode 100644 index 0c49152a1b..0000000000 --- a/include/pdf/SkPDFFormXObject.h +++ /dev/null @@ -1,48 +0,0 @@ - -/* - * Copyright 2010 The Android Open Source Project - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - - -#ifndef SkPDFFormXObject_DEFINED -#define SkPDFFormXObject_DEFINED - -#include "SkPDFStream.h" -#include "SkPDFTypes.h" -#include "SkRefCnt.h" -#include "SkString.h" - -class SkMatrix; -class SkPDFDevice; -class SkPDFCatalog; - -/** \class SkPDFFormXObject - - A form XObject; a self contained description of graphics objects. A form - XObject is basically a page object with slightly different syntax, that - can be drawn onto a page. -*/ - -// The caller could keep track of the form XObjects it creates and -// canonicalize them, but the Skia API doesn't provide enough context to -// automatically do it (trivially). -class SkPDFFormXObject : public SkPDFStream { -public: - /** Create a PDF form XObject. Entries for the dictionary entries are - * automatically added. - * @param device The set of graphical elements on this form. - */ - explicit SkPDFFormXObject(SkPDFDevice* device); - virtual ~SkPDFFormXObject(); - - // The SkPDFObject interface. - virtual void getResources(SkTDArray<SkPDFObject*>* resourceList); - -private: - SkTDArray<SkPDFObject*> fResources; -}; - -#endif diff --git a/include/pdf/SkPDFGraphicState.h b/include/pdf/SkPDFGraphicState.h deleted file mode 100644 index af01737276..0000000000 --- a/include/pdf/SkPDFGraphicState.h +++ /dev/null @@ -1,101 +0,0 @@ - -/* - * Copyright 2010 The Android Open Source Project - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - - -#ifndef SkPDFGraphicState_DEFINED -#define SkPDFGraphicState_DEFINED - -#include "SkPaint.h" -#include "SkPDFTypes.h" -#include "SkTemplates.h" -#include "SkThread.h" - -class SkPDFFormXObject; - -/** \class SkPDFGraphicState - SkPaint objects roughly correspond to graphic state dictionaries that can - be installed. So that a given dictionary is only output to the pdf file - once, we want to canonicalize them. Static methods in this class manage - a weakly referenced set of SkPDFGraphicState objects: when the last - reference to a SkPDFGraphicState is removed, it removes itself from the - static set of objects. - -*/ -class SkPDFGraphicState : public SkPDFDict { -public: - virtual ~SkPDFGraphicState(); - - virtual void getResources(SkTDArray<SkPDFObject*>* resourceList); - - // Override emitObject and getOutputSize so that we can populate - // the dictionary on demand. - virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, - bool indirect); - virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); - - /** Get the graphic state for the passed SkPaint. The reference count of - * the object is incremented and it is the caller's responsibility to - * unreference it when done. This is needed to accommodate the weak - * reference pattern used when the returned object is new and has no - * other references. - * @param paint The SkPaint to emulate. - */ - static SkPDFGraphicState* GetGraphicStateForPaint(const SkPaint& paint); - - /** Make a graphic state that only sets the passed soft mask. The - * reference count of the object is incremented and it is the caller's - * responsibility to unreference it when done. - * @param sMask The form xobject to use as a soft mask. - * @param invert Indicates if the alpha of the sMask should be inverted. - */ - static SkPDFGraphicState* GetSMaskGraphicState(SkPDFFormXObject* sMask, - bool invert); - - /** Get a graphic state that only unsets the soft mask. The reference - * count of the object is incremented and it is the caller's responsibility - * to unreference it when done. This is needed to accommodate the weak - * reference pattern used when the returned object is new and has no - * other references. - */ - static SkPDFGraphicState* GetNoSMaskGraphicState(); - -private: - const SkPaint fPaint; - SkTDArray<SkPDFObject*> fResources; - bool fPopulated; - bool fSMask; - - class GSCanonicalEntry { - public: - SkPDFGraphicState* fGraphicState; - const SkPaint* fPaint; - - bool operator==(const GSCanonicalEntry& b) const; - explicit GSCanonicalEntry(SkPDFGraphicState* gs) - : fGraphicState(gs), - fPaint(&gs->fPaint) {} - explicit GSCanonicalEntry(const SkPaint* paint) - : fGraphicState(NULL), - fPaint(paint) {} - }; - - // This should be made a hash table if performance is a problem. - static SkTDArray<GSCanonicalEntry>& CanonicalPaints(); - static SkBaseMutex& CanonicalPaintsMutex(); - - SkPDFGraphicState(); - explicit SkPDFGraphicState(const SkPaint& paint); - - void populateDict(); - - static SkPDFObject* GetInvertFunction(); - - static int Find(const SkPaint& paint); -}; - -#endif diff --git a/include/pdf/SkPDFImage.h b/include/pdf/SkPDFImage.h deleted file mode 100644 index 48b0157da9..0000000000 --- a/include/pdf/SkPDFImage.h +++ /dev/null @@ -1,70 +0,0 @@ - -/* - * Copyright 2010 The Android Open Source Project - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - - -#ifndef SkPDFImage_DEFINED -#define SkPDFImage_DEFINED - -#include "SkPDFStream.h" -#include "SkPDFTypes.h" -#include "SkRefCnt.h" - -class SkBitmap; -class SkPaint; -class SkPDFCatalog; -struct SkIRect; - -/** \class SkPDFImage - - An image XObject. -*/ - -// We could play the same trick here as is done in SkPDFGraphicState, storing -// a copy of the Bitmap object (not the pixels), the pixel generation number, -// and settings used from the paint to canonicalize image objects. -class SkPDFImage : public SkPDFStream { -public: - /** Create a new Image XObject to represent the passed bitmap. - * @param bitmap The image to encode. - * @param srcRect The rectangle to cut out of bitmap. - * @param paint Used to calculate alpha, masks, etc. - * @return The image XObject or NUll if there is nothing to draw for - * the given parameters. - */ - static SkPDFImage* CreateImage(const SkBitmap& bitmap, - const SkIRect& srcRect, - const SkPaint& paint); - - virtual ~SkPDFImage(); - - /** Add a Soft Mask (alpha or shape channel) to the image. Refs mask. - * @param mask A gray scale image representing the mask. - * @return The mask argument is returned. - */ - SkPDFImage* addSMask(SkPDFImage* mask); - - // The SkPDFObject interface. - virtual void getResources(SkTDArray<SkPDFObject*>* resourceList); - -private: - SkTDArray<SkPDFObject*> fResources; - - /** Create a PDF image XObject. Entries for the image properties are - * automatically added to the stream dictionary. - * @param imageData The final raw bits representing the image. - * @param bitmap The image parameters to use (Config, etc). - * @param srcRect The clipping applied to bitmap before generating - * imageData. - * @param alpha Is this the alpha channel of the bitmap. - * @param paint Used to calculate alpha, masks, etc. - */ - SkPDFImage(SkStream* imageData, const SkBitmap& bitmap, - const SkIRect& srcRect, bool alpha, const SkPaint& paint); -}; - -#endif diff --git a/include/pdf/SkPDFPage.h b/include/pdf/SkPDFPage.h deleted file mode 100644 index e726638ebb..0000000000 --- a/include/pdf/SkPDFPage.h +++ /dev/null @@ -1,100 +0,0 @@ - -/* - * Copyright 2010 The Android Open Source Project - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - - -#ifndef SkPDFPage_DEFINED -#define SkPDFPage_DEFINED - -#include "SkPDFTypes.h" -#include "SkPDFStream.h" -#include "SkRefCnt.h" -#include "SkTDArray.h" - -class SkPDFCatalog; -class SkPDFDevice; -class SkWStream; - -/** \class SkPDFPage - - A SkPDFPage contains meta information about a page, is used in the page - tree and points to the content of the page. -*/ -class SkPDFPage : public SkPDFDict { -public: - /** Create a PDF page with the passed PDF device. The device need not - * have content on it yet. - * @param content The page content. - */ - explicit SkPDFPage(SkPDFDevice* content); - ~SkPDFPage(); - - /** Before a page and its contents can be sized and emitted, it must - * be finalized. No changes to the PDFDevice will be honored after - * finalizePage has been called. This function adds the page content - * to the passed catalog, so it must be called for each document - * that the page is part of. - * @param catalog The catalog to add page content objects to. - * @param firstPage Indicate if this is the first page of a document. - * @param resourceObjects All the resource objects (recursively) used on - * the page are added to this array. This gives - * the caller a chance to deduplicate resources - * across pages. - */ - void finalizePage(SkPDFCatalog* catalog, bool firstPage, - SkTDArray<SkPDFObject*>* resourceObjects); - - /** Determine the size of the page content and store to the catalog - * the offsets of all nonresource-indirect objects that make up the page - * content. This must be called before emitPage(), but after finalizePage. - * @param catalog The catalog to add the object offsets to. - * @param fileOffset The file offset where the page content will be - * emitted. - */ - off_t getPageSize(SkPDFCatalog* catalog, off_t fileOffset); - - /** Output the page content to the passed stream. - * @param stream The writable output stream to send the content to. - * @param catalog The active object catalog. - */ - void emitPage(SkWStream* stream, SkPDFCatalog* catalog); - - /** Generate a page tree for the passed vector of pages. New objects are - * added to the catalog. The pageTree vector is populated with all of - * the 'Pages' dictionaries as well as the 'Page' objects. Page trees - * have both parent and children links, creating reference cycles, so - * it must be torn down explicitly. The first page is not added to - * the pageTree dictionary array so the caller can handle it specially. - * @param pages The ordered vector of page objects. - * @param catalog The catalog to add new objects into. - * @param pageTree An output vector with all of the internal and leaf - * nodes of the pageTree. - * @param rootNode An output parameter set to the root node. - */ - static void GeneratePageTree(const SkTDArray<SkPDFPage*>& pages, - SkPDFCatalog* catalog, - SkTDArray<SkPDFDict*>* pageTree, - SkPDFDict** rootNode); - - /** Get the fonts used on this page. - */ - SK_API const SkTDArray<SkPDFFont*>& getFontResources() const; - - /** Returns a SkPDFGlyphSetMap which represents glyph usage of every font - * that shows on this page. - */ - const SkPDFGlyphSetMap& getFontGlyphUsage() const; - -private: - // Multiple pages may reference the content. - SkRefPtr<SkPDFDevice> fDevice; - - // Once the content is finalized, put it into a stream for output. - SkRefPtr<SkPDFStream> fContentStream; -}; - -#endif diff --git a/include/pdf/SkPDFShader.h b/include/pdf/SkPDFShader.h deleted file mode 100644 index 439d83bbd5..0000000000 --- a/include/pdf/SkPDFShader.h +++ /dev/null @@ -1,65 +0,0 @@ - -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - - -#ifndef SkPDFShader_DEFINED -#define SkPDFShader_DEFINED - -#include "SkPDFStream.h" -#include "SkPDFTypes.h" -#include "SkMatrix.h" -#include "SkRefCnt.h" -#include "SkShader.h" - -class SkObjRef; -class SkPDFCatalog; - -/** \class SkPDFShader - - In PDF parlance, this is a pattern, used in place of a color when the - pattern color space is selected. -*/ - -class SkPDFShader { -public: - /** Get the PDF shader for the passed SkShader. If the SkShader is - * invalid in some way, returns NULL. The reference count of - * the object is incremented and it is the caller's responsibility to - * unreference it when done. This is needed to accommodate the weak - * reference pattern used when the returned object is new and has no - * other references. - * @param shader The SkShader to emulate. - * @param matrix The current transform. (PDF shaders are absolutely - * positioned, relative to where the page is drawn.) - * @param surfceBBox The bounding box of the drawing surface (with matrix - * already applied). - */ - static SkPDFObject* GetPDFShader(const SkShader& shader, - const SkMatrix& matrix, - const SkIRect& surfaceBBox); - -protected: - class State; - - class ShaderCanonicalEntry { - public: - ShaderCanonicalEntry(SkPDFObject* pdfShader, const State* state); - bool operator==(const ShaderCanonicalEntry& b) const; - - SkPDFObject* fPDFShader; - const State* fState; - }; - // This should be made a hash table if performance is a problem. - static SkTDArray<ShaderCanonicalEntry>& CanonicalShaders(); - static SkBaseMutex& CanonicalShadersMutex(); - static void RemoveShader(SkPDFObject* shader); - - SkPDFShader(); -}; - -#endif diff --git a/include/pdf/SkPDFStream.h b/include/pdf/SkPDFStream.h deleted file mode 100644 index b3a7ad34e3..0000000000 --- a/include/pdf/SkPDFStream.h +++ /dev/null @@ -1,75 +0,0 @@ - -/* - * Copyright 2010 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - - -#ifndef SkPDFStream_DEFINED -#define SkPDFStream_DEFINED - -#include "SkPDFTypes.h" -#include "SkRefCnt.h" -#include "SkStream.h" -#include "SkTemplates.h" - -class SkPDFCatalog; - -/** \class SkPDFStream - - A stream object in a PDF. Note, all streams must be indirect objects (via - SkObjRef). -*/ -class SkPDFStream : public SkPDFDict { -public: - /** Create a PDF stream. A Length entry is automatically added to the - * stream dictionary. The stream may be retained (stream->ref() may be - * called) so its contents must not be changed after calling this. - * @param data The data part of the stream. - */ - explicit SkPDFStream(SkData* data); - /** Deprecated constructor. */ - explicit SkPDFStream(SkStream* stream); - /** Create a PDF stream with the same content and dictionary entries - * as the passed one. - */ - explicit SkPDFStream(const SkPDFStream& pdfStream); - virtual ~SkPDFStream(); - - // The SkPDFObject interface. - virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, - bool indirect); - virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); - -protected: - /* Create a PDF stream with no data. The setData method must be called to - * set the data. - */ - SkPDFStream(); - - void setData(SkStream* stream); - -private: - enum State { - kUnused_State, //!< The stream hasn't been requested yet. - kNoCompression_State, //!< The stream's been requested in an - // uncompressed form. - kCompressed_State, //!< The stream's already been compressed. - }; - // Indicates what form (or if) the stream has been requested. - State fState; - - // TODO(vandebo): Use SkData (after removing deprecated constructor). - SkRefPtr<SkStream> fData; - SkRefPtr<SkPDFStream> fSubstitute; - - typedef SkPDFDict INHERITED; - - // Populate the stream dictionary. This method returns false if - // fSubstitute should be used. - bool populate(SkPDFCatalog* catalog); -}; - -#endif diff --git a/include/pdf/SkPDFTypes.h b/include/pdf/SkPDFTypes.h deleted file mode 100644 index 6334938d77..0000000000 --- a/include/pdf/SkPDFTypes.h +++ /dev/null @@ -1,403 +0,0 @@ - -/* - * Copyright 2010 The Android Open Source Project - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - - -#ifndef SkPDFTypes_DEFINED -#define SkPDFTypes_DEFINED - -#include "SkRefCnt.h" -#include "SkScalar.h" -#include "SkString.h" -#include "SkTDArray.h" -#include "SkTypes.h" - -class SkPDFCatalog; -class SkWStream; - -/** \class SkPDFObject - - A PDF Object is the base class for primitive elements in a PDF file. A - common subtype is used to ease the use of indirect object references, - which are common in the PDF format. -*/ -class SkPDFObject : public SkRefCnt { -public: - /** Create a PDF object. - */ - SkPDFObject(); - virtual ~SkPDFObject(); - - /** Return the size (number of bytes) of this object in the final output - * file. Compound objects or objects that are computationally intensive - * to output should override this method. - * @param catalog The object catalog to use. - * @param indirect If true, output an object identifier with the object. - */ - virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); - - /** For non-primitive objects (i.e. objects defined outside this file), - * this method will add to resourceList any objects that this method - * depends on. This operates recursively so if this object depends on - * another object and that object depends on two more, all three objects - * will be added. - * @param resourceList The list to append dependant resources to. - */ - virtual void getResources(SkTDArray<SkPDFObject*>* resourceList); - - /** Emit this object unless the catalog has a substitute object, in which - * case emit that. - * @see emitObject - */ - void emit(SkWStream* stream, SkPDFCatalog* catalog, bool indirect); - - /** Helper function to output an indirect object. - * @param catalog The object catalog to use. - * @param stream The writable output stream to send the output to. - */ - void emitIndirectObject(SkWStream* stream, SkPDFCatalog* catalog); - - /** Helper function to find the size of an indirect object. - * @param catalog The object catalog to use. - */ - size_t getIndirectOutputSize(SkPDFCatalog* catalog); - - /** Static helper function to add a resource to a list. The list takes - * a reference. - * @param resource The resource to add. - * @param list The list to add the resource to. - */ - static void AddResourceHelper(SkPDFObject* resource, - SkTDArray<SkPDFObject*>* list); - - /** Static helper function to copy and reference the resources (and all - * their subresources) into a new list. - * @param resources The resource list. - * @param result The list to add to. - */ - static void GetResourcesHelper(SkTDArray<SkPDFObject*>* resources, - SkTDArray<SkPDFObject*>* result); - -protected: - /** Subclasses must implement this method to print the object to the - * PDF file. - * @param catalog The object catalog to use. - * @param indirect If true, output an object identifier with the object. - * @param stream The writable output stream to send the output to. - */ - virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, - bool indirect) = 0; -}; - -/** \class SkPDFObjRef - - An indirect reference to a PDF object. -*/ -class SkPDFObjRef : public SkPDFObject { -public: - /** Create a reference to an existing SkPDFObject. - * @param obj The object to reference. - */ - explicit SkPDFObjRef(SkPDFObject* obj); - virtual ~SkPDFObjRef(); - - // The SkPDFObject interface. - virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, - bool indirect); - virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); - -private: - SkRefPtr<SkPDFObject> fObj; -}; - -/** \class SkPDFInt - - An integer object in a PDF. -*/ -class SkPDFInt : public SkPDFObject { -public: - /** Create a PDF integer (usually for indirect reference purposes). - * @param value An integer value between 2^31 - 1 and -2^31. - */ - explicit SkPDFInt(int32_t value); - virtual ~SkPDFInt(); - - // The SkPDFObject interface. - virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, - bool indirect); - -private: - int32_t fValue; -}; - -/** \class SkPDFBool - - An boolean value in a PDF. -*/ -class SkPDFBool : public SkPDFObject { -public: - /** Create a PDF boolean. - * @param value true or false. - */ - explicit SkPDFBool(bool value); - virtual ~SkPDFBool(); - - // The SkPDFObject interface. - virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, - bool indirect); - virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); - -private: - bool fValue; -}; - -/** \class SkPDFScalar - - A real number object in a PDF. -*/ -class SkPDFScalar : public SkPDFObject { -public: - /** Create a PDF real number. - * @param value A real value. - */ - explicit SkPDFScalar(SkScalar value); - virtual ~SkPDFScalar(); - - static void Append(SkScalar value, SkWStream* stream); - - // The SkPDFObject interface. - virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, - bool indirect); - -private: - SkScalar fValue; -}; - -/** \class SkPDFString - - A string object in a PDF. -*/ -class SkPDFString : public SkPDFObject { -public: - /** Create a PDF string. Maximum length (in bytes) is 65,535. - * @param value A string value. - */ - explicit SkPDFString(const char value[]); - explicit SkPDFString(const SkString& value); - - /** Create a PDF string. Maximum length (in bytes) is 65,535. - * @param value A string value. - * @param len The length of value. - * @param wideChars Indicates if the top byte in value is significant and - * should be encoded (true) or not (false). - */ - SkPDFString(const uint16_t* value, size_t len, bool wideChars); - virtual ~SkPDFString(); - - // The SkPDFObject interface. - virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, - bool indirect); - virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); - - static SkString FormatString(const char* input, size_t len); - static SkString FormatString(const uint16_t* input, size_t len, - bool wideChars); -private: - static const size_t kMaxLen = 65535; - - const SkString fValue; - - static SkString DoFormatString(const void* input, size_t len, - bool wideInput, bool wideOutput); -}; - -/** \class SkPDFName - - A name object in a PDF. -*/ -class SkPDFName : public SkPDFObject { -public: - /** Create a PDF name object. Maximum length is 127 bytes. - * @param value The name. - */ - explicit SkPDFName(const char name[]); - explicit SkPDFName(const SkString& name); - virtual ~SkPDFName(); - - bool operator==(const SkPDFName& b) const; - - // The SkPDFObject interface. - virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, - bool indirect); - virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); - -private: - static const size_t kMaxLen = 127; - - const SkString fValue; - - static SkString FormatName(const SkString& input); -}; - -/** \class SkPDFArray - - An array object in a PDF. -*/ -class SkPDFArray : public SkPDFObject { -public: - /** Create a PDF array. Maximum length is 8191. - */ - SkPDFArray(); - virtual ~SkPDFArray(); - - // The SkPDFObject interface. - virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, - bool indirect); - virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); - - /** The size of the array. - */ - int size() { return fValue.count(); } - - /** Preallocate space for the given number of entries. - * @param length The number of array slots to preallocate. - */ - void reserve(int length); - - /** Returns the object at the given offset in the array. - * @param index The index into the array to retrieve. - */ - SkPDFObject* getAt(int index) { return fValue[index]; } - - /** Set the object at the given offset in the array. Ref's value. - * @param index The index into the array to set. - * @param value The value to add to the array. - * @return The value argument is returned. - */ - SkPDFObject* setAt(int index, SkPDFObject* value); - - /** Append the object to the end of the array and increments its ref count. - * @param value The value to add to the array. - * @return The value argument is returned. - */ - SkPDFObject* append(SkPDFObject* value); - - /** Creates a SkPDFInt object and appends it to the array. - * @param value The value to add to the array. - */ - void appendInt(int32_t value); - - /** Creates a SkPDFScalar object and appends it to the array. - * @param value The value to add to the array. - */ - void appendScalar(SkScalar value); - - /** Creates a SkPDFName object and appends it to the array. - * @param value The value to add to the array. - */ - void appendName(const char name[]); - -private: - static const int kMaxLen = 8191; - SkTDArray<SkPDFObject*> fValue; -}; - -/** \class SkPDFDict - - A dictionary object in a PDF. -*/ -class SkPDFDict : public SkPDFObject { -public: - /** Create a PDF dictionary. Maximum number of entries is 4095. - */ - SkPDFDict(); - - /** Create a PDF dictionary with a Type entry. - * @param type The value of the Type entry. - */ - explicit SkPDFDict(const char type[]); - - virtual ~SkPDFDict(); - - // The SkPDFObject interface. - virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, - bool indirect); - virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); - - /** The size of the dictionary. - */ - int size() { return fValue.count(); } - - /** Add the value to the dictionary with the given key. Refs value. - * @param key The key for this dictionary entry. - * @param value The value for this dictionary entry. - * @return The value argument is returned. - */ - SkPDFObject* insert(SkPDFName* key, SkPDFObject* value); - - /** Add the value to the dictionary with the given key. Refs value. The - * method will create the SkPDFName object. - * @param key The text of the key for this dictionary entry. - * @param value The value for this dictionary entry. - * @return The value argument is returned. - */ - SkPDFObject* insert(const char key[], SkPDFObject* value); - - /** Add the int to the dictionary with the given key. - * @param key The text of the key for this dictionary entry. - * @param value The int value for this dictionary entry. - */ - void insertInt(const char key[], int32_t value); - - /** Add the scalar to the dictionary with the given key. - * @param key The text of the key for this dictionary entry. - * @param value The scalar value for this dictionary entry. - */ - void insertScalar(const char key[], SkScalar value); - - /** Add the name to the dictionary with the given key. - * @param key The text of the key for this dictionary entry. - * @param name The name for this dictionary entry. - */ - void insertName(const char key[], const char name[]); - - /** Add the name to the dictionary with the given key. - * @param key The text of the key for this dictionary entry. - * @param name The name for this dictionary entry. - */ - void insertName(const char key[], const SkString& name) { - this->insertName(key, name.c_str()); - } - - /** Remove all entries from the dictionary. - */ - void clear(); - -private: - struct Rec { - SkPDFName* key; - SkPDFObject* value; - }; - -public: - class Iter { - public: - explicit Iter(const SkPDFDict& dict); - SkPDFName* next(SkPDFObject** value); - - private: - Rec* fIter; - Rec* fStop; - }; - -private: - static const int kMaxLen = 4095; - - SkTDArray<struct Rec> fValue; -}; - -#endif diff --git a/include/pdf/SkPDFUtils.h b/include/pdf/SkPDFUtils.h deleted file mode 100644 index 5b9d74e321..0000000000 --- a/include/pdf/SkPDFUtils.h +++ /dev/null @@ -1,54 +0,0 @@ - -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - - -#ifndef SkPDFUtils_DEFINED -#define SkPDFUtils_DEFINED - -#include "SkPath.h" - -class SkMatrix; -class SkPath; -class SkPDFArray; -struct SkRect; - -#if 0 -#define PRINT_NOT_IMPL(str) fprintf(stderr, str) -#else -#define PRINT_NOT_IMPL(str) -#endif - -#define NOT_IMPLEMENTED(condition, assert) \ - do { \ - if (condition) { \ - PRINT_NOT_IMPL("NOT_IMPLEMENTED: " #condition "\n"); \ - SkDEBUGCODE(SkASSERT(!assert);) \ - } \ - } while (0) - -class SkPDFUtils { -public: - static SkPDFArray* MatrixToArray(const SkMatrix& matrix); - static void AppendTransform(const SkMatrix& matrix, SkWStream* content); - - static void MoveTo(SkScalar x, SkScalar y, SkWStream* content); - static void AppendLine(SkScalar x, SkScalar y, SkWStream* content); - static void AppendCubic(SkScalar ctl1X, SkScalar ctl1Y, - SkScalar ctl2X, SkScalar ctl2Y, - SkScalar dstX, SkScalar dstY, SkWStream* content); - static void AppendRectangle(const SkRect& rect, SkWStream* content); - static void EmitPath(const SkPath& path, SkWStream* content); - static void ClosePath(SkWStream* content); - static void PaintPath(SkPaint::Style style, SkPath::FillType fill, - SkWStream* content); - static void StrokePath(SkWStream* content); - static void DrawFormXObject(int objectIndex, SkWStream* content); - static void ApplyGraphicState(int objectIndex, SkWStream* content); -}; - -#endif |