#ifdef GL_ES precision lowp float; #endif varying vec4 v_fragmentColor; varying vec2 v_texCoord; uniform float outlineSize; uniform vec3 outlineColor; uniform vec2 textureSize; uniform vec3 foregroundColor; int getIsStrokeWithAngelIndex(float angel) { float rad = angel * 0.01745329252; int stroke = 0; float a = texture2D(CC_Texture0, vec2(v_texCoord.x + outlineSize * cos(rad) / textureSize.x, v_texCoord.y + outlineSize * sin(rad) / textureSize.y)).a; if (a >= 0.5) { stroke = 1; } return stroke; } void main() { vec4 myC = texture2D(CC_Texture0, vec2(v_texCoord.x, v_texCoord.y)); myC.rgb *= foregroundColor; if (myC.a >= 0.5) { gl_FragColor = v_fragmentColor * myC; return; } int strokeCount = 0; strokeCount += getIsStrokeWithAngelIndex(0.0); strokeCount += getIsStrokeWithAngelIndex(30.0); strokeCount += getIsStrokeWithAngelIndex(60.0); strokeCount += getIsStrokeWithAngelIndex(90.0); strokeCount += getIsStrokeWithAngelIndex(120.0); strokeCount += getIsStrokeWithAngelIndex(150.0); strokeCount += getIsStrokeWithAngelIndex(180.0); strokeCount += getIsStrokeWithAngelIndex(210.0); strokeCount += getIsStrokeWithAngelIndex(240.0); strokeCount += getIsStrokeWithAngelIndex(270.0); strokeCount += getIsStrokeWithAngelIndex(300.0); strokeCount += getIsStrokeWithAngelIndex(330.0); if (strokeCount > 0) { myC.rgb = outlineColor; myC.a = 1.0; } gl_FragColor = v_fragmentColor * myC; }