| Index: src/gpu/effects/GrEllipseEdgeEffect.cpp
|
| ===================================================================
|
| --- src/gpu/effects/GrEllipseEdgeEffect.cpp (revision 0)
|
| +++ src/gpu/effects/GrEllipseEdgeEffect.cpp (working copy)
|
| @@ -0,0 +1,83 @@
|
| +/*
|
| + * Copyright 2013 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "GrEllipseEdgeEffect.h"
|
| +#include "gl/GrGLEffect.h"
|
| +#include "gl/GrGLEffectMatrix.h"
|
| +#include "gl/GrGLSL.h"
|
| +#include "gl/GrGLTexture.h"
|
| +#include "GrTBackendEffectFactory.h"
|
| +#include "GrTexture.h"
|
| +
|
| +#define ELLIPSE_EDGE_ATTR0 "aEllipseEdge"
|
| +
|
| +class GrGLEllipseEdgeEffect : public GrGLEffect {
|
| +public:
|
| + GrGLEllipseEdgeEffect(const GrBackendEffectFactory& factory, const GrEffectRef&)
|
| + : INHERITED (factory) {}
|
| +
|
| + virtual void emitCode(GrGLShaderBuilder* builder,
|
| + const GrEffectStage&,
|
| + EffectKey key,
|
| + const char* vertexCoords,
|
| + const char* outputColor,
|
| + const char* inputColor,
|
| + const TextureSamplerArray& samplers) SK_OVERRIDE {
|
| + const char *vsName, *fsName;
|
| + builder->addVarying(kVec4f_GrSLType, "EllipseEdge", &vsName, &fsName);
|
| + builder->addAttribute(kVec4f_GrSLType, ELLIPSE_EDGE_ATTR0);
|
| +
|
| + builder->fVSCode.appendf("\t%s = " ELLIPSE_EDGE_ATTR0 ";\n", vsName);
|
| +
|
| + builder->fFSCode.append("\tfloat edgeAlpha;\n");
|
| + // translate to origin
|
| + builder->fFSCode.appendf("\tvec2 offset = (%s.xy - %s.xy);\n", builder->fragmentPosition(), fsName);
|
| + // scale y by xRadius/yRadius
|
| + builder->fFSCode.appendf("\toffset.y *= %s.w;\n", fsName);
|
| + builder->fFSCode.append("\tfloat d = length(offset);\n");
|
| + // compare length against xRadius
|
| + builder->fFSCode.appendf("\tedgeAlpha = smoothstep(d - 0.5, d + 0.5, %s.z);\n", fsName);
|
| + builder->fFSCode.appendf("\t%s = ", outputColor);
|
| + GrGLSLModulate4f(&builder->fFSCode, inputColor, "edgeAlpha");
|
| + builder->fFSCode.append(";\n");
|
| +
|
| + }
|
| +
|
| + static inline EffectKey GenKey(const GrEffectStage& stage, const GrGLCaps&) {
|
| + return 0;
|
| + }
|
| +
|
| + virtual void setData(const GrGLUniformManager& uman, const GrEffectStage& stage) SK_OVERRIDE {
|
| + }
|
| +
|
| +private:
|
| + typedef GrGLEffect INHERITED;
|
| +};
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +GrEllipseEdgeEffect::GrEllipseEdgeEffect() : GrEffect() {
|
| + this->addVertexAttribName(ELLIPSE_EDGE_ATTR0);
|
| +}
|
| +
|
| +void GrEllipseEdgeEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const {
|
| + *validFlags = 0;
|
| +}
|
| +
|
| +const GrBackendEffectFactory& GrEllipseEdgeEffect::getFactory() const {
|
| + return GrTBackendEffectFactory<GrEllipseEdgeEffect>::getInstance();
|
| +}
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +GR_DEFINE_EFFECT_TEST(GrEllipseEdgeEffect);
|
| +
|
| +GrEffectRef* GrEllipseEdgeEffect::TestCreate(SkMWCRandom* random,
|
| + GrContext* context,
|
| + GrTexture* textures[]) {
|
| + return GrEllipseEdgeEffect::Create();
|
| +}
|
|
|