| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2013 Google Inc. | 2  * Copyright 2013 Google Inc. | 
| 3  * | 3  * | 
| 4  * Use of this source code is governed by a BSD-style license that can be | 4  * Use of this source code is governed by a BSD-style license that can be | 
| 5  * found in the LICENSE file. | 5  * found in the LICENSE file. | 
| 6  */ | 6  */ | 
| 7 | 7 | 
| 8 #include "GrOvalRenderer.h" | 8 #include "GrOvalRenderer.h" | 
| 9 | 9 | 
| 10 #include "GrEffect.h" | 10 #include "GrEffect.h" | 
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 84     public: | 84     public: | 
| 85         GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) | 85         GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) | 
| 86         : INHERITED (factory) {} | 86         : INHERITED (factory) {} | 
| 87 | 87 | 
| 88         virtual void emitCode(GrGLShaderBuilder* builder, | 88         virtual void emitCode(GrGLShaderBuilder* builder, | 
| 89                               const GrDrawEffect& drawEffect, | 89                               const GrDrawEffect& drawEffect, | 
| 90                               EffectKey key, | 90                               EffectKey key, | 
| 91                               const char* outputColor, | 91                               const char* outputColor, | 
| 92                               const char* inputColor, | 92                               const char* inputColor, | 
| 93                               const TextureSamplerArray& samplers) SK_OVERRIDE { | 93                               const TextureSamplerArray& samplers) SK_OVERRIDE { | 
|  | 94             GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder->getVertex
     Builder(); | 
|  | 95             SkASSERT(NULL != vertexBuilder); | 
|  | 96 | 
| 94             const CircleEdgeEffect& circleEffect = drawEffect.castEffect<CircleE
     dgeEffect>(); | 97             const CircleEdgeEffect& circleEffect = drawEffect.castEffect<CircleE
     dgeEffect>(); | 
| 95             const char *vsName, *fsName; | 98             const char *vsName, *fsName; | 
| 96             builder->addVarying(kVec4f_GrSLType, "CircleEdge", &vsName, &fsName)
     ; | 99             vertexBuilder->addVarying(kVec4f_GrSLType, "CircleEdge", &vsName, &f
     sName); | 
| 97 | 100 | 
| 98             const SkString* attrName = | 101             const SkString* attrName = | 
| 99                 builder->getEffectAttributeName(drawEffect.getVertexAttribIndice
     s()[0]); | 102                 vertexBuilder->getEffectAttributeName(drawEffect.getVertexAttrib
     Indices()[0]); | 
| 100             builder->vsCodeAppendf("\t%s = %s;\n", vsName, attrName->c_str()); | 103             vertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsName, attrName->c_str
     ()); | 
| 101 | 104 | 
| 102             builder->fsCodeAppendf("\tfloat d = length(%s.xy);\n", fsName); | 105             builder->fsCodeAppendf("\tfloat d = length(%s.xy);\n", fsName); | 
| 103             builder->fsCodeAppendf("\tfloat edgeAlpha = clamp(%s.z - d, 0.0, 1.0
     );\n", fsName); | 106             builder->fsCodeAppendf("\tfloat edgeAlpha = clamp(%s.z - d, 0.0, 1.0
     );\n", fsName); | 
| 104             if (circleEffect.isStroked()) { | 107             if (circleEffect.isStroked()) { | 
| 105                 builder->fsCodeAppendf("\tfloat innerAlpha = clamp(d - %s.w, 0.0
     , 1.0);\n", fsName); | 108                 builder->fsCodeAppendf("\tfloat innerAlpha = clamp(d - %s.w, 0.0
     , 1.0);\n", fsName); | 
| 106                 builder->fsCodeAppend("\tedgeAlpha *= innerAlpha;\n"); | 109                 builder->fsCodeAppend("\tedgeAlpha *= innerAlpha;\n"); | 
| 107             } | 110             } | 
| 108 | 111 | 
| 109             SkString modulate; | 112             SkString modulate; | 
| 110             GrGLSLModulatef<4>(&modulate, inputColor, "edgeAlpha"); | 113             GrGLSLModulatef<4>(&modulate, inputColor, "edgeAlpha"); | 
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 195     public: | 198     public: | 
| 196         GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) | 199         GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) | 
| 197         : INHERITED (factory) {} | 200         : INHERITED (factory) {} | 
| 198 | 201 | 
| 199         virtual void emitCode(GrGLShaderBuilder* builder, | 202         virtual void emitCode(GrGLShaderBuilder* builder, | 
| 200                               const GrDrawEffect& drawEffect, | 203                               const GrDrawEffect& drawEffect, | 
| 201                               EffectKey key, | 204                               EffectKey key, | 
| 202                               const char* outputColor, | 205                               const char* outputColor, | 
| 203                               const char* inputColor, | 206                               const char* inputColor, | 
| 204                               const TextureSamplerArray& samplers) SK_OVERRIDE { | 207                               const TextureSamplerArray& samplers) SK_OVERRIDE { | 
|  | 208             GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder->getVertex
     Builder(); | 
|  | 209             SkASSERT(NULL != vertexBuilder); | 
|  | 210 | 
| 205             const EllipseEdgeEffect& ellipseEffect = drawEffect.castEffect<Ellip
     seEdgeEffect>(); | 211             const EllipseEdgeEffect& ellipseEffect = drawEffect.castEffect<Ellip
     seEdgeEffect>(); | 
| 206 | 212 | 
| 207             const char *vsOffsetName, *fsOffsetName; | 213             const char *vsOffsetName, *fsOffsetName; | 
| 208             const char *vsRadiiName, *fsRadiiName; | 214             const char *vsRadiiName, *fsRadiiName; | 
| 209 | 215 | 
| 210             builder->addVarying(kVec2f_GrSLType, "EllipseOffsets", &vsOffsetName
     , &fsOffsetName); | 216             vertexBuilder->addVarying(kVec2f_GrSLType, "EllipseOffsets", &vsOffs
     etName, &fsOffsetName); | 
| 211             const SkString* attr0Name = | 217             const SkString* attr0Name = | 
| 212                 builder->getEffectAttributeName(drawEffect.getVertexAttribIndice
     s()[0]); | 218                 vertexBuilder->getEffectAttributeName(drawEffect.getVertexAttrib
     Indices()[0]); | 
| 213             builder->vsCodeAppendf("\t%s = %s;\n", vsOffsetName, attr0Name->c_st
     r()); | 219             vertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsOffsetName, attr0Name
     ->c_str()); | 
| 214 | 220 | 
| 215             builder->addVarying(kVec4f_GrSLType, "EllipseRadii", &vsRadiiName, &
     fsRadiiName); | 221             vertexBuilder->addVarying(kVec4f_GrSLType, "EllipseRadii", &vsRadiiN
     ame, &fsRadiiName); | 
| 216             const SkString* attr1Name = | 222             const SkString* attr1Name = | 
| 217                 builder->getEffectAttributeName(drawEffect.getVertexAttribIndice
     s()[1]); | 223                 vertexBuilder->getEffectAttributeName(drawEffect.getVertexAttrib
     Indices()[1]); | 
| 218             builder->vsCodeAppendf("\t%s = %s;\n", vsRadiiName, attr1Name->c_str
     ()); | 224             vertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsRadiiName, attr1Name-
     >c_str()); | 
| 219 | 225 | 
| 220             // for outer curve | 226             // for outer curve | 
| 221             builder->fsCodeAppendf("\tvec2 scaledOffset = %s*%s.xy;\n", fsOffset
     Name, fsRadiiName); | 227             builder->fsCodeAppendf("\tvec2 scaledOffset = %s*%s.xy;\n", fsOffset
     Name, fsRadiiName); | 
| 222             builder->fsCodeAppend("\tfloat test = dot(scaledOffset, scaledOffset
     ) - 1.0;\n"); | 228             builder->fsCodeAppend("\tfloat test = dot(scaledOffset, scaledOffset
     ) - 1.0;\n"); | 
| 223             builder->fsCodeAppendf("\tvec2 grad = 2.0*scaledOffset*%s.xy;\n", fs
     RadiiName); | 229             builder->fsCodeAppendf("\tvec2 grad = 2.0*scaledOffset*%s.xy;\n", fs
     RadiiName); | 
| 224             builder->fsCodeAppend("\tfloat grad_dot = dot(grad, grad);\n"); | 230             builder->fsCodeAppend("\tfloat grad_dot = dot(grad, grad);\n"); | 
| 225             // we need to clamp the length^2 of the gradiant vector to a non-zer
     o value, because | 231             // we need to clamp the length^2 of the gradiant vector to a non-zer
     o value, because | 
| 226             // on the Nexus 4 the undefined result of inversesqrt(0) drops out a
     n entire tile | 232             // on the Nexus 4 the undefined result of inversesqrt(0) drops out a
     n entire tile | 
| 227             // TODO: restrict this to Adreno-only | 233             // TODO: restrict this to Adreno-only | 
| 228             builder->fsCodeAppend("\tgrad_dot = max(grad_dot, 1.0e-4);\n"); | 234             builder->fsCodeAppend("\tgrad_dot = max(grad_dot, 1.0e-4);\n"); | 
| (...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 851         } | 857         } | 
| 852 | 858 | 
| 853         // drop out the middle quad if we're stroked | 859         // drop out the middle quad if we're stroked | 
| 854         int indexCnt = isStroked ? GR_ARRAY_COUNT(gRRectIndices)-6 : GR_ARRAY_CO
     UNT(gRRectIndices); | 860         int indexCnt = isStroked ? GR_ARRAY_COUNT(gRRectIndices)-6 : GR_ARRAY_CO
     UNT(gRRectIndices); | 
| 855         target->setIndexSourceToBuffer(indexBuffer); | 861         target->setIndexSourceToBuffer(indexBuffer); | 
| 856         target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou
     nds); | 862         target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou
     nds); | 
| 857     } | 863     } | 
| 858 | 864 | 
| 859     return true; | 865     return true; | 
| 860 } | 866 } | 
| OLD | NEW | 
|---|