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