107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org/*
207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Copyright 2013 Google Inc.
307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org *
407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * found in the LICENSE file.
607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org */
707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org#ifndef GrBezierEffect_DEFINED
944a77c8158016996f79eb0ac98bb85996174bb89skia.committer@gmail.com#define GrBezierEffect_DEFINED
1007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
1107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org#include "GrDrawTargetCaps.h"
12b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "GrProcessor.h"
13249af15fb82833d2274850c589812b6e69df0033joshualitt#include "GrGeometryProcessor.h"
14cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org#include "GrTypesPriv.h"
1507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
1607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org/**
1707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Shader is based off of Loop-Blinn Quadratic GPU Rendering
1807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * The output of this effect is a hairline edge for conics.
1907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Conics specified by implicit equation K^2 - LM.
2007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * K, L, and M, are the first three values of the vertex attribute,
2107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * the fourth value is not used. Distance is calculated using a
2207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * first order approximation from the taylor series.
2307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Coverage for AA is max(0, 1-distance).
2407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org *
2507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Test were also run using a second order distance approximation.
2607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * There were two versions of the second order approx. The first version
2707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * is of roughly the form:
2807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * f(q) = |f(p)| - ||f'(p)||*||q-p|| - ||f''(p)||*||q-p||^2.
2907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * The second is similar:
3007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * f(q) = |f(p)| + ||f'(p)||*||q-p|| + ||f''(p)||*||q-p||^2.
3107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * The exact version of the equations can be found in the paper
3207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * "Distance Approximations for Rasterizing Implicit Curves" by Gabriel Taubin
3307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org *
3407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * In both versions we solve the quadratic for ||q-p||.
3507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Version 1:
3607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * gFM is magnitude of first partials and gFM2 is magnitude of 2nd partials (as derived from paper)
3707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * builder->fsCodeAppend("\t\tedgeAlpha = (sqrt(gFM*gFM+4.0*func*gF2M) - gFM)/(2.0*gF2M);\n");
3807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Version 2:
3907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * builder->fsCodeAppend("\t\tedgeAlpha = (gFM - sqrt(gFM*gFM-4.0*func*gF2M))/(2.0*gF2M);\n");
4007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org *
4107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Also note that 2nd partials of k,l,m are zero
4207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org *
4307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * When comparing the two second order approximations to the first order approximations,
4407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * the following results were found. Version 1 tends to underestimate the distances, thus it
4507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * basically increases all the error that we were already seeing in the first order
4607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * approx. So this version is not the one to use. Version 2 has the opposite effect
4707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * and tends to overestimate the distances. This is much closer to what we are
4807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * looking for. It is able to render ellipses (even thin ones) without the need to chop.
4907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * However, it can not handle thin hyperbolas well and thus would still rely on
5007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * chopping to tighten the clipping. Another side effect of the overestimating is
5107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * that the curves become much thinner and "ropey". If all that was ever rendered
5207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * were "not too thin" curves and ellipses then 2nd order may have an advantage since
5307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * only one geometry would need to be rendered. However no benches were run comparing
5407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * chopped first order and non chopped 2nd order.
5507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org */
5607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgclass GrGLConicEffect;
5707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
58249af15fb82833d2274850c589812b6e69df0033joshualittclass GrConicEffect : public GrGeometryProcessor {
5907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgpublic:
60b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static GrGeometryProcessor* Create(const GrPrimitiveEdgeType edgeType,
61b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                       const GrDrawTargetCaps& caps) {
62b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GR_CREATE_STATIC_GEOMETRY_PROCESSOR(gConicFillAA, GrConicEffect,
63b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                            (kFillAA_GrProcessorEdgeType));
64b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GR_CREATE_STATIC_GEOMETRY_PROCESSOR(gConicHairAA, GrConicEffect,
65b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                            (kHairlineAA_GrProcessorEdgeType));
66b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GR_CREATE_STATIC_GEOMETRY_PROCESSOR(gConicFillBW, GrConicEffect,
67b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                            (kFillBW_GrProcessorEdgeType));
68cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        switch (edgeType) {
69b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            case kFillAA_GrProcessorEdgeType:
70cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                if (!caps.shaderDerivativeSupport()) {
71cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                    return NULL;
72cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                }
73cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                gConicFillAA->ref();
74cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                return gConicFillAA;
75b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            case kHairlineAA_GrProcessorEdgeType:
76cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                if (!caps.shaderDerivativeSupport()) {
77cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                    return NULL;
78cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                }
79cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                gConicHairAA->ref();
80cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                return gConicHairAA;
81b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            case kFillBW_GrProcessorEdgeType:
82cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                gConicFillBW->ref();
83cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                return gConicFillBW;
84cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org            default:
8507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                return NULL;
8607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        }
8707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    }
8807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
8907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    virtual ~GrConicEffect();
9007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
9107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    static const char* Name() { return "Conic"; }
9207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
93249af15fb82833d2274850c589812b6e69df0033joshualitt    inline const GrShaderVar& inConicCoeffs() const { return fInConicCoeffs; }
94b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    inline bool isAntiAliased() const { return GrProcessorEdgeTypeIsAA(fEdgeType); }
95b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    inline bool isFilled() const { return GrProcessorEdgeTypeIsFill(fEdgeType); }
96b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    inline GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
9707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
98b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    typedef GrGLConicEffect GLProcessor;
9907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
10007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    virtual void getConstantColorComponents(GrColor* color,
10107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                            uint32_t* validFlags) const SK_OVERRIDE {
10207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        *validFlags = 0;
10307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    }
10407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
105b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
10607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
10707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgprivate:
108b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrConicEffect(GrPrimitiveEdgeType);
10907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
110b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual bool onIsEqual(const GrProcessor& other) const SK_OVERRIDE;
11107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
112b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrPrimitiveEdgeType   fEdgeType;
113249af15fb82833d2274850c589812b6e69df0033joshualitt    const GrShaderVar& fInConicCoeffs;
11407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
115b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
11607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
117249af15fb82833d2274850c589812b6e69df0033joshualitt    typedef GrGeometryProcessor INHERITED;
11807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org};
11907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
12007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org///////////////////////////////////////////////////////////////////////////////
12107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org/**
12207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * The output of this effect is a hairline edge for quadratics.
12307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Quadratic specified by 0=u^2-v canonical coords. u and v are the first
12407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * two components of the vertex attribute. At the three control points that define
12507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * the Quadratic, u, v have the values {0,0}, {1/2, 0}, and {1, 1} respectively.
12607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Coverage for AA is min(0, 1-distance). 3rd & 4th cimponent unused.
12707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Requires shader derivative instruction support.
12807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org */
12907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgclass GrGLQuadEffect;
13007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
131249af15fb82833d2274850c589812b6e69df0033joshualittclass GrQuadEffect : public GrGeometryProcessor {
13207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgpublic:
133b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static GrGeometryProcessor* Create(const GrPrimitiveEdgeType edgeType,
134b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                       const GrDrawTargetCaps& caps) {
135b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GR_CREATE_STATIC_GEOMETRY_PROCESSOR(gQuadFillAA, GrQuadEffect,
136b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                            (kFillAA_GrProcessorEdgeType));
137b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GR_CREATE_STATIC_GEOMETRY_PROCESSOR(gQuadHairAA, GrQuadEffect,
138b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                            (kHairlineAA_GrProcessorEdgeType));
139b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GR_CREATE_STATIC_GEOMETRY_PROCESSOR(gQuadFillBW, GrQuadEffect,
140b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                            (kFillBW_GrProcessorEdgeType));
141cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        switch (edgeType) {
142b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            case kFillAA_GrProcessorEdgeType:
143cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                if (!caps.shaderDerivativeSupport()) {
144cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                    return NULL;
145cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                }
146cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                gQuadFillAA->ref();
147cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                return gQuadFillAA;
148b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            case kHairlineAA_GrProcessorEdgeType:
149cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                if (!caps.shaderDerivativeSupport()) {
150cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                    return NULL;
151cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                }
152cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                gQuadHairAA->ref();
153cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                return gQuadHairAA;
154b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            case kFillBW_GrProcessorEdgeType:
155cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                gQuadFillBW->ref();
156cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                return gQuadFillBW;
157cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org            default:
15807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                return NULL;
15907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        }
16007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    }
16107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
16207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    virtual ~GrQuadEffect();
16307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
16407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    static const char* Name() { return "Quad"; }
16507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
166249af15fb82833d2274850c589812b6e69df0033joshualitt    inline const GrShaderVar& inHairQuadEdge() const { return fInHairQuadEdge; }
167b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    inline bool isAntiAliased() const { return GrProcessorEdgeTypeIsAA(fEdgeType); }
168b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    inline bool isFilled() const { return GrProcessorEdgeTypeIsFill(fEdgeType); }
169b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    inline GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
17007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
171b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    typedef GrGLQuadEffect GLProcessor;
17207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
17307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    virtual void getConstantColorComponents(GrColor* color,
17407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                            uint32_t* validFlags) const SK_OVERRIDE {
17507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        *validFlags = 0;
17607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    }
17707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
178b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
17907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
18007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgprivate:
181b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrQuadEffect(GrPrimitiveEdgeType);
18207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
183b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual bool onIsEqual(const GrProcessor& other) const SK_OVERRIDE;
18407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
185b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrPrimitiveEdgeType   fEdgeType;
186249af15fb82833d2274850c589812b6e69df0033joshualitt    const GrShaderVar& fInHairQuadEdge;
18707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
188b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
18907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
190249af15fb82833d2274850c589812b6e69df0033joshualitt    typedef GrGeometryProcessor INHERITED;
19107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org};
19207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
19307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
19407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org/**
19507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Shader is based off of "Resolution Independent Curve Rendering using
19607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Programmable Graphics Hardware" by Loop and Blinn.
19707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * The output of this effect is a hairline edge for non rational cubics.
19807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Cubics are specified by implicit equation K^3 - LM.
19907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * K, L, and M, are the first three values of the vertex attribute,
20007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * the fourth value is not used. Distance is calculated using a
20107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * first order approximation from the taylor series.
20207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org * Coverage for AA is max(0, 1-distance).
20307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org */
20407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgclass GrGLCubicEffect;
20507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
206249af15fb82833d2274850c589812b6e69df0033joshualittclass GrCubicEffect : public GrGeometryProcessor {
20707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgpublic:
208b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    static GrGeometryProcessor* Create(const GrPrimitiveEdgeType edgeType,
209b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                       const GrDrawTargetCaps& caps) {
210b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GR_CREATE_STATIC_GEOMETRY_PROCESSOR(gCubicFillAA, GrCubicEffect,
211b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                            (kFillAA_GrProcessorEdgeType));
212b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GR_CREATE_STATIC_GEOMETRY_PROCESSOR(gCubicHairAA, GrCubicEffect,
213b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                            (kHairlineAA_GrProcessorEdgeType));
214b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        GR_CREATE_STATIC_GEOMETRY_PROCESSOR(gCubicFillBW, GrCubicEffect,
215b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                            (kFillBW_GrProcessorEdgeType));
216cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org        switch (edgeType) {
217b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            case kFillAA_GrProcessorEdgeType:
218cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                if (!caps.shaderDerivativeSupport()) {
219cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                    return NULL;
220cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                }
221cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                gCubicFillAA->ref();
222cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                return gCubicFillAA;
223b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            case kHairlineAA_GrProcessorEdgeType:
224cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                if (!caps.shaderDerivativeSupport()) {
225cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                    return NULL;
226cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                }
227cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                gCubicHairAA->ref();
228cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                return gCubicHairAA;
229b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            case kFillBW_GrProcessorEdgeType:
230cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                gCubicFillBW->ref();
231cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org                return gCubicFillBW;
232cabf4b2f3664b98c1084fbb94a999af15ddfb52dcommit-bot@chromium.org            default:
23307e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                return NULL;
23407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        }
23507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    }
23607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
23707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    virtual ~GrCubicEffect();
23807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
23907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    static const char* Name() { return "Cubic"; }
24007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
241249af15fb82833d2274850c589812b6e69df0033joshualitt    inline const GrShaderVar& inCubicCoeffs() const { return fInCubicCoeffs; }
242b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    inline bool isAntiAliased() const { return GrProcessorEdgeTypeIsAA(fEdgeType); }
243b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    inline bool isFilled() const { return GrProcessorEdgeTypeIsFill(fEdgeType); }
244b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    inline GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
24507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
246b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    typedef GrGLCubicEffect GLProcessor;
24707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
24807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    virtual void getConstantColorComponents(GrColor* color,
24907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org                                            uint32_t* validFlags) const SK_OVERRIDE {
25007e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org        *validFlags = 0;
25107e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org    }
25207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
253b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
25407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
25507e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.orgprivate:
256b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrCubicEffect(GrPrimitiveEdgeType);
25707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
258b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual bool onIsEqual(const GrProcessor& other) const SK_OVERRIDE;
25907e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
260b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrPrimitiveEdgeType   fEdgeType;
261249af15fb82833d2274850c589812b6e69df0033joshualitt    const GrShaderVar& fInCubicCoeffs;
26207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
263b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
26407e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
265249af15fb82833d2274850c589812b6e69df0033joshualitt    typedef GrGeometryProcessor INHERITED;
26607e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org};
26707e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org
26807e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org#endif
269