Home | History | Annotate | Download | only in pdf
      1 /*
      2  * Copyright 2015 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 #ifndef SkPDFCanon_DEFINED
      8 #define SkPDFCanon_DEFINED
      9 
     10 #include "SkPDFGraphicState.h"
     11 #include "SkPDFShader.h"
     12 #include "SkTDArray.h"
     13 #include "SkTHash.h"
     14 
     15 class SkBitmap;
     16 class SkPDFFont;
     17 class SkPDFBitmap;
     18 class SkPaint;
     19 
     20 /**
     21  *  The SkPDFCanon canonicalizes objects across PDF pages(SkPDFDevices).
     22  *
     23  *  The PDF backend works correctly if:
     24  *  -  There is no more than one SkPDFCanon for each thread.
     25  *  -  Every SkPDFDevice is given a pointer to a SkPDFCanon on creation.
     26  *  -  All SkPDFDevices in a document share the same SkPDFCanon.
     27  *  The SkDocument_PDF class makes this happen by owning a single
     28  *  SkPDFCanon.
     29  *
     30  *  The addFoo() methods will ref the Foo; the canon's destructor will
     31  *  call foo->unref() on all of these objects.
     32  *
     33  *  The findFoo() methods do not change the ref count of the Foo
     34  *  objects.
     35  */
     36 class SkPDFCanon : SkNoncopyable {
     37 public:
     38     ~SkPDFCanon() { this->reset(); }
     39 
     40     // reset to original setting, unrefs all objects.
     41     void reset();
     42 
     43     // Returns exact match if there is one.  If not, it returns NULL.
     44     // If there is no exact match, but there is a related font, we
     45     // still return NULL, but also set *relatedFont.
     46     SkPDFFont* findFont(uint32_t fontID,
     47                         uint16_t glyphID,
     48                         SkPDFFont** relatedFont) const;
     49     void addFont(SkPDFFont* font, uint32_t fontID, uint16_t fGlyphID);
     50 
     51     SkPDFFunctionShader* findFunctionShader(const SkPDFShader::State&) const;
     52     void addFunctionShader(SkPDFFunctionShader*);
     53 
     54     SkPDFAlphaFunctionShader* findAlphaShader(const SkPDFShader::State&) const;
     55     void addAlphaShader(SkPDFAlphaFunctionShader*);
     56 
     57     SkPDFImageShader* findImageShader(const SkPDFShader::State&) const;
     58     void addImageShader(SkPDFImageShader*);
     59 
     60     const SkPDFGraphicState* findGraphicState(const SkPDFGraphicState&) const;
     61     void addGraphicState(const SkPDFGraphicState*);
     62 
     63     SkPDFBitmap* findBitmap(const SkBitmap&) const;
     64     void addBitmap(SkPDFBitmap*);
     65 
     66 private:
     67     struct FontRec {
     68         SkPDFFont* fFont;
     69         uint32_t fFontID;
     70         uint16_t fGlyphID;
     71     };
     72     SkTDArray<FontRec> fFontRecords;
     73 
     74     SkTDArray<SkPDFFunctionShader*> fFunctionShaderRecords;
     75 
     76     SkTDArray<SkPDFAlphaFunctionShader*> fAlphaShaderRecords;
     77 
     78     SkTDArray<SkPDFImageShader*> fImageShaderRecords;
     79 
     80     struct WrapGS {
     81         explicit WrapGS(const SkPDFGraphicState* ptr = NULL) : fPtr(ptr) {}
     82         const SkPDFGraphicState* fPtr;
     83         bool operator==(const WrapGS& rhs) const {
     84             SkASSERT(fPtr);
     85             SkASSERT(rhs.fPtr);
     86             return *fPtr == *rhs.fPtr;
     87         }
     88         static uint32_t Hash(const WrapGS& w) {
     89             SkASSERT(w.fPtr);
     90             return w.fPtr->hash();
     91         }
     92     };
     93     SkTHashSet<WrapGS, WrapGS::Hash> fGraphicStateRecords;
     94 
     95     SkTDArray<SkPDFBitmap*> fBitmapRecords;
     96 };
     97 #endif  // SkPDFCanon_DEFINED
     98