10063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel/*
20063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel * Copyright 2015 Google Inc.
30063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel *
40063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel * Use of this source code is governed by a BSD-style license that can be
50063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel * found in the LICENSE file.
60063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel */
70063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
80063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel#ifndef GrCustomXfermodePriv_DEFINED
90063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel#define GrCustomXfermodePriv_DEFINED
100063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
110063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel#include "GrCoordTransform.h"
1250785a3d10b53bea5beb6e18431a2449860be237bsalomon#include "GrDrawTargetCaps.h"
130063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel#include "GrFragmentProcessor.h"
140063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel#include "GrTextureAccess.h"
1554f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel#include "GrXferProcessor.h"
160063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel#include "SkXfermode.h"
170063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
180063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdanielclass GrGLCaps;
190063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdanielclass GrGLFragmentProcessor;
200063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdanielclass GrInvariantOutput;
210063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdanielclass GrProcessorKeyBuilder;
220063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdanielclass GrTexture;
230063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
240063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel///////////////////////////////////////////////////////////////////////////////
250063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel// Fragment Processor
260063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel///////////////////////////////////////////////////////////////////////////////
270063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
280063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdanielclass GrCustomXferFP : public GrFragmentProcessor {
290063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdanielpublic:
300063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel    GrCustomXferFP(SkXfermode::Mode mode, GrTexture* background);
310063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
32cfc18867d982119d9dc2888bf09f1093012daaddjvanverth    void getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override;
330063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
3436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    GrGLFragmentProcessor* createGLInstance() const override;
350063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
3636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* name() const override { return "Custom Xfermode"; }
370063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
380063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel    SkXfermode::Mode mode() const { return fMode; }
390063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel    const GrTextureAccess&  backgroundAccess() const { return fBackgroundAccess; }
400063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
410063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdanielprivate:
4236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool onIsEqual(const GrFragmentProcessor& other) const override;
430063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
4436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
450063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
460063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel    GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
470063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
480063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel    SkXfermode::Mode fMode;
490063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel    GrCoordTransform fBackgroundTransform;
500063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel    GrTextureAccess  fBackgroundAccess;
510063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
520063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel    typedef GrFragmentProcessor INHERITED;
530063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel};
540063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
5554f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel///////////////////////////////////////////////////////////////////////////////
5654f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel// Xfer Processor
5754f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel///////////////////////////////////////////////////////////////////////////////
5854f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel
5954f0e9d784122cfd3f5968e0fea971d5b5a4805aegdanielclass GrCustomXPFactory : public GrXPFactory {
6054f0e9d784122cfd3f5968e0fea971d5b5a4805aegdanielpublic:
6154f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel    GrCustomXPFactory(SkXfermode::Mode mode);
6254f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel
6336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const override {
6454f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel        return true;
6554f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel    }
6654f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel
6754f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel    void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI,
6836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                            GrXPFactory::InvariantOutput*) const override;
6954f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel
7021b2c53218ab25f4268e3992e51d916076a2a7eebsalomonprivate:
713ad6570e94965d54871eaea8b314f560b82ca792egdaniel    GrXferProcessor* onCreateXferProcessor(const GrDrawTargetCaps& caps,
723ad6570e94965d54871eaea8b314f560b82ca792egdaniel                                           const GrProcOptInfo& colorPOI,
7350785a3d10b53bea5beb6e18431a2449860be237bsalomon                                           const GrProcOptInfo& coveragePOI,
7436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                                           const GrDeviceCoordTexture* dstCopy) const override;
7550785a3d10b53bea5beb6e18431a2449860be237bsalomon
763ad6570e94965d54871eaea8b314f560b82ca792egdaniel    bool willReadDstColor(const GrDrawTargetCaps& caps,
773ad6570e94965d54871eaea8b314f560b82ca792egdaniel                          const GrProcOptInfo& colorPOI,
788917d62ef4d9bde9ec4f879dc42b309b03a0ad98cdalton                          const GrProcOptInfo& coveragePOI) const override;
7950785a3d10b53bea5beb6e18431a2449860be237bsalomon
8036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool onIsEqual(const GrXPFactory& xpfBase) const override {
8154f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel        const GrCustomXPFactory& xpf = xpfBase.cast<GrCustomXPFactory>();
8254f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel        return fMode == xpf.fMode;
8354f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel    }
8454f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel
8554f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel    GR_DECLARE_XP_FACTORY_TEST;
8654f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel
8754f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel    SkXfermode::Mode fMode;
8854f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel
8954f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel    typedef GrXPFactory INHERITED;
9054f0e9d784122cfd3f5968e0fea971d5b5a4805aegdaniel};
910063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel#endif
920063a9b69a6a5d377f207c2aa1ea1e7220c19ba9egdaniel
93