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