Home | History | Annotate | Download | only in core
      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 
      8 #ifndef SkXfermode_proccoeff_DEFINED
      9 #define SkXfermode_proccoeff_DEFINED
     10 
     11 #include "SkReadBuffer.h"
     12 #include "SkWriteBuffer.h"
     13 
     14 struct ProcCoeff {
     15     SkXfermodeProc      fProc;
     16     SkXfermodeProc4f    fProc4f;
     17     SkXfermode::Coeff   fSC;
     18     SkXfermode::Coeff   fDC;
     19 };
     20 
     21 #define CANNOT_USE_COEFF    SkXfermode::Coeff(-1)
     22 
     23 class SK_API SkProcCoeffXfermode : public SkXfermode {
     24 public:
     25     SkProcCoeffXfermode(const ProcCoeff& rec, SkBlendMode mode) {
     26         fMode = mode;
     27         fProc = rec.fProc;
     28         // these may be valid, or may be CANNOT_USE_COEFF
     29         fSrcCoeff = rec.fSC;
     30         fDstCoeff = rec.fDC;
     31     }
     32 
     33     void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
     34                 const SkAlpha aa[]) const override;
     35     void xfer16(uint16_t dst[], const SkPMColor src[], int count,
     36                 const SkAlpha aa[]) const override;
     37     void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
     38                 const SkAlpha aa[]) const override;
     39 
     40     bool asMode(Mode* mode) const override;
     41 
     42     bool supportsCoverageAsAlpha() const override;
     43 
     44     bool isOpaque(SkXfermode::SrcColorOpacity opacityType) const override;
     45 
     46 #if SK_SUPPORT_GPU
     47     sk_sp<GrFragmentProcessor> makeFragmentProcessorForImageFilter(
     48                                                         sk_sp<GrFragmentProcessor>) const override;
     49     const GrXPFactory* asXPFactory() const override;
     50 #endif
     51 
     52     SK_TO_STRING_OVERRIDE()
     53     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode)
     54 
     55 protected:
     56     void flatten(SkWriteBuffer& buffer) const override;
     57 
     58     SkBlendMode getMode() const { return fMode; }
     59 
     60     SkXfermodeProc getProc() const { return fProc; }
     61 
     62 private:
     63     SkXfermodeProc  fProc;
     64     SkBlendMode     fMode;
     65     Coeff           fSrcCoeff, fDstCoeff;
     66 
     67     friend class SkXfermode;
     68 
     69     typedef SkXfermode INHERITED;
     70 };
     71 
     72 #endif // #ifndef SkXfermode_proccoeff_DEFINED
     73