| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  * Copyright 2014 Google Inc. |    2  * Copyright 2014 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 #ifndef GrPorterDuffXferProcessor_DEFINED |    8 #ifndef GrPorterDuffXferProcessor_DEFINED | 
|    9 #define GrPorterDuffXferProcessor_DEFINED |    9 #define GrPorterDuffXferProcessor_DEFINED | 
|   10  |   10  | 
|   11 #include "GrTypes.h" |   11 #include "GrTypes.h" | 
|   12 #include "GrXferProcessor.h" |   12 #include "GrXferProcessor.h" | 
|   13 #include "SkXfermode.h" |   13 #include "SkXfermode.h" | 
|   14  |   14  | 
|   15 class GrDrawState; |   15 class GrDrawState; | 
|   16 class GrInvariantOutput; |   16 class GrInvariantOutput; | 
|   17  |   17  | 
|   18 class GrPorterDuffXferProcessor : public GrXferProcessor { |   18 class GrPorterDuffXferProcessor : public GrXferProcessor { | 
|   19 public: |   19 public: | 
|   20     static GrXferProcessor* Create(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend)
      { |   20     static GrXferProcessor* Create(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend, | 
|   21         return SkNEW_ARGS(GrPorterDuffXferProcessor, (srcBlend, dstBlend)); |   21                                    GrColor constant = 0) { | 
 |   22         return SkNEW_ARGS(GrPorterDuffXferProcessor, (srcBlend, dstBlend, consta
     nt)); | 
|   22     } |   23     } | 
|   23  |   24  | 
|   24     virtual ~GrPorterDuffXferProcessor(); |   25     virtual ~GrPorterDuffXferProcessor(); | 
|   25  |   26  | 
|   26     virtual const char* name() const { return "Porter Duff"; } |   27     virtual const char* name() const { return "Porter Duff"; } | 
|   27  |   28  | 
|   28     virtual void getGLProcessorKey(const GrGLCaps& caps, |   29     virtual void getGLProcessorKey(const GrGLCaps& caps, | 
|   29                                    GrProcessorKeyBuilder* b) const SK_OVERRIDE; |   30                                    GrProcessorKeyBuilder* b) const SK_OVERRIDE; | 
|   30  |   31  | 
|   31     virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |   32     virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; | 
|   32  |   33  | 
 |   34     virtual GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colo
     rPOI, | 
 |   35                                                        const GrProcOptInfo& cove
     ragePOI, | 
 |   36                                                        bool isCoverageDrawing, | 
 |   37                                                        bool colorWriteDisabled, | 
 |   38                                                        bool doesStencilWrite, | 
 |   39                                                        GrColor* color, | 
 |   40                                                        uint8_t* coverage) SK_OVE
     RRIDE; | 
 |   41  | 
 |   42     virtual void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OV
     ERRIDE { | 
 |   43         blendInfo->fSrcBlend = fSrcBlend; | 
 |   44         blendInfo->fDstBlend = fDstBlend; | 
 |   45         blendInfo->fBlendConstant = fBlendConstant; | 
 |   46     } | 
 |   47  | 
|   33 private: |   48 private: | 
|   34     GrPorterDuffXferProcessor(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend); |   49     GrPorterDuffXferProcessor(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend, GrCo
     lor constant); | 
|   35  |   50  | 
|   36     virtual bool onIsEqual(const GrFragmentProcessor& fpBase) const SK_OVERRIDE 
     { |   51     virtual bool onIsEqual(const GrFragmentProcessor& fpBase) const SK_OVERRIDE 
     { | 
|   37         const GrPorterDuffXferProcessor& xp = fpBase.cast<GrPorterDuffXferProces
     sor>(); |   52         const GrPorterDuffXferProcessor& xp = fpBase.cast<GrPorterDuffXferProces
     sor>(); | 
|   38         if (fSrcBlend != xp.fSrcBlend || fDstBlend != xp.fDstBlend) { |   53         if (fSrcBlend != xp.fSrcBlend || | 
 |   54             fDstBlend != xp.fDstBlend || | 
 |   55             fBlendConstant != xp.fBlendConstant) { | 
|   39             return false; |   56             return false; | 
|   40         } |   57         } | 
|   41         return true; |   58         return true; | 
|   42     } |   59     } | 
|   43  |   60  | 
|   44     virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
     RRIDE; |   61     virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
     RRIDE; | 
|   45  |   62  | 
|   46     GrBlendCoeff fSrcBlend; |   63     GrBlendCoeff fSrcBlend; | 
|   47     GrBlendCoeff fDstBlend; |   64     GrBlendCoeff fDstBlend; | 
|   48      |   65     GrColor      fBlendConstant; | 
 |   66  | 
|   49     typedef GrXferProcessor INHERITED; |   67     typedef GrXferProcessor INHERITED; | 
|   50 }; |   68 }; | 
|   51  |   69  | 
|   52 /////////////////////////////////////////////////////////////////////////////// |   70 /////////////////////////////////////////////////////////////////////////////// | 
|   53  |   71  | 
|   54 class GrPorterDuffXPFactory : public GrXPFactory { |   72 class GrPorterDuffXPFactory : public GrXPFactory { | 
|   55 public: |   73 public: | 
|   56     static GrXPFactory* Create(SkXfermode::Mode mode);  |   74     static GrXPFactory* Create(SkXfermode::Mode mode);  | 
|   57  |   75  | 
|   58     static GrXPFactory* Create(SkXfermode::Coeff src, SkXfermode::Coeff dst) { |   76     static GrXPFactory* Create(SkXfermode::Coeff src, SkXfermode::Coeff dst) { | 
|   59         return SkNEW_ARGS(GrPorterDuffXPFactory, ((GrBlendCoeff)(src), (GrBlendC
     oeff)(dst))); |   77         return SkNEW_ARGS(GrPorterDuffXPFactory, ((GrBlendCoeff)(src), (GrBlendC
     oeff)(dst))); | 
|   60     } |   78     } | 
|   61  |   79  | 
|   62     static GrXPFactory* Create(GrBlendCoeff src, GrBlendCoeff dst) { |   80     static GrXPFactory* Create(GrBlendCoeff src, GrBlendCoeff dst) { | 
|   63         return SkNEW_ARGS(GrPorterDuffXPFactory, (src, dst)); |   81         return SkNEW_ARGS(GrPorterDuffXPFactory, (src, dst)); | 
|   64     } |   82     } | 
|   65  |   83  | 
|   66     const GrXferProcessor* createXferProcessor() const SK_OVERRIDE; |   84     GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, | 
 |   85                                          const GrProcOptInfo& coveragePOI) const
      SK_OVERRIDE; | 
|   67  |   86  | 
|   68     bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const
      SK_OVERRIDE; |   87     bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const
      SK_OVERRIDE; | 
|   69  |   88  | 
 |   89     bool canApplyCoverage(const GrProcOptInfo& colorPOI, const GrProcOptInfo& co
     veragePOI, | 
 |   90                           bool isCoverageDrawing, bool colorWriteDisabled) const
      SK_OVERRIDE; | 
 |   91  | 
 |   92     bool willBlendWithDst(const GrProcOptInfo& colorPOI, const GrProcOptInfo& co
     veragePOI, | 
 |   93                           bool isCoverageDrawing, bool colorWriteDisabled) const
      SK_OVERRIDE; | 
 |   94  | 
 |   95     bool canTweakAlphaForCoverage(bool isCoverageDrawing) const SK_OVERRIDE; | 
 |   96  | 
 |   97     bool getOpaqueAndKnownColor(const GrProcOptInfo& colorPOI, | 
 |   98                                 const GrProcOptInfo& coveragePOI, | 
 |   99                                 GrColor* solidColor, | 
 |  100                                 uint32_t* solidColorKnownComponents) const SK_OV
     ERRIDE; | 
 |  101  | 
|   70 private: |  102 private: | 
|   71     GrPorterDuffXPFactory(GrBlendCoeff src, GrBlendCoeff dst);  |  103     GrPorterDuffXPFactory(GrBlendCoeff src, GrBlendCoeff dst);  | 
|   72  |  104  | 
|   73     bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE { |  105     bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE { | 
|   74         const GrPorterDuffXPFactory& xpf = xpfBase.cast<GrPorterDuffXPFactory>()
     ; |  106         const GrPorterDuffXPFactory& xpf = xpfBase.cast<GrPorterDuffXPFactory>()
     ; | 
|   75         return (fSrc == xpf.fSrc && fDst == xpf.fDst); |  107         return (fSrcCoeff == xpf.fSrcCoeff && fDstCoeff == xpf.fDstCoeff); | 
|   76     } |  108     } | 
|   77  |  109  | 
|   78     GrBlendCoeff fSrc; |  110     GrBlendCoeff fSrcCoeff; | 
|   79     GrBlendCoeff fDst; |  111     GrBlendCoeff fDstCoeff; | 
|   80  |  112  | 
|   81     typedef GrXPFactory INHERITED; |  113     typedef GrXPFactory INHERITED; | 
|   82 }; |  114 }; | 
|   83  |  115  | 
|   84 #endif |  116 #endif | 
| OLD | NEW |