From 378092f3d10b1dd62967f419c35cfefec7c10ee7 Mon Sep 17 00:00:00 2001 From: egdaniel Date: Wed, 3 Dec 2014 10:40:13 -0800 Subject: Add XferProcessor factory in GrPaint and GrDrawState. In this CL the XP should have zero effect on the actual rendering pipeline. BUG=skia: Review URL: https://codereview.chromium.org/751283002 --- include/core/SkXfermode.h | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'include/core') diff --git a/include/core/SkXfermode.h b/include/core/SkXfermode.h index 6d723e8fc2..35e9837483 100644 --- a/include/core/SkXfermode.h +++ b/include/core/SkXfermode.h @@ -15,6 +15,7 @@ class GrFragmentProcessor; class GrTexture; +class GrXPFactory; class SkString; /** \class SkXfermode @@ -198,16 +199,28 @@ public: fragment shader. If NULL, the effect should request access to destination color (setWillReadDstColor()), and use that in the fragment shader (builder->dstColor()). */ + // TODO: Once all custom xp's have been created the background parameter will be required here. + // We will always use the XPFactory if there is no background texture and the fragment if + // there is one. virtual bool asFragmentProcessor(GrFragmentProcessor**, GrTexture* background = NULL) const; - /** Returns true if the xfermode can be expressed as coeffs (src, dst), or as an effect - (effect). This helper calls the asCoeff() and asFragmentProcessor() virtuals. If the - xfermode is NULL, it is treated as kSrcOver_Mode. It is legal to call this with all params - NULL to simply test the return value. effect, src, and dst must all be NULL or all - non-NULL. + /** A subclass may implement this factory function to work with the GPU backend. It is legal + to call this with xpf NULL to simply test the return value. If xpf is non-NULL then the + xfermode may optionally allocate a factory to return to the caller as *xpf. The caller + will install it and own a ref to it. Since the xfermode may or may not assign *xpf, the + caller should set *xpf to NULL beforehand. XP's cannot use a background texture since they + have no coord transforms. + */ + virtual bool asXPFactory(GrXPFactory** xpf) const; + + /** Returns true if the xfermode can be expressed as an xfer processor factory (xpFactory), + or a fragment processor. This helper calls the asCoeff(), asXPFactory(), + and asFragmentProcessor() virtuals. If the xfermode is NULL, it is treated as kSrcOver_Mode. + It is legal to call this with all params NULL to simply test the return value. + fp, xpf, src, and dst must all be NULL or all non-NULL. */ - static bool asFragmentProcessorOrCoeff(SkXfermode*, GrFragmentProcessor**, Coeff* src, - Coeff* dst, GrTexture* background = NULL); + static bool AsFragmentProcessorOrXPFactory(SkXfermode*, GrFragmentProcessor**, + GrXPFactory**, Coeff* src, Coeff* dst); SK_TO_STRING_PUREVIRT() SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() -- cgit v1.2.3