| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 The Android Open Source Project | 2 * Copyright 2012 The Android Open Source Project |
| 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 "SkLightingImageFilter.h" | 8 #include "SkLightingImageFilter.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
| (...skipping 1640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1651 void GrGLLightingEffect::emitCode(EmitArgs& args) { | 1651 void GrGLLightingEffect::emitCode(EmitArgs& args) { |
| 1652 fImageIncrementUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment
_Visibility, | 1652 fImageIncrementUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment
_Visibility, |
| 1653 kVec2f_GrSLType, kDefault_GrSLPrec
ision, | 1653 kVec2f_GrSLType, kDefault_GrSLPrec
ision, |
| 1654 "ImageIncrement"); | 1654 "ImageIncrement"); |
| 1655 fSurfaceScaleUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_V
isibility, | 1655 fSurfaceScaleUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_V
isibility, |
| 1656 kFloat_GrSLType, kDefault_GrSLPrecisi
on, | 1656 kFloat_GrSLType, kDefault_GrSLPrecisi
on, |
| 1657 "SurfaceScale"); | 1657 "SurfaceScale"); |
| 1658 fLight->emitLightColorUniform(args.fBuilder); | 1658 fLight->emitLightColorUniform(args.fBuilder); |
| 1659 SkString lightFunc; | 1659 SkString lightFunc; |
| 1660 this->emitLightFunc(args.fBuilder, &lightFunc); | 1660 this->emitLightFunc(args.fBuilder, &lightFunc); |
| 1661 static const GrGLShaderVar gSobelArgs[] = { | 1661 static const GrGLSLShaderVar gSobelArgs[] = { |
| 1662 GrGLShaderVar("a", kFloat_GrSLType), | 1662 GrGLSLShaderVar("a", kFloat_GrSLType), |
| 1663 GrGLShaderVar("b", kFloat_GrSLType), | 1663 GrGLSLShaderVar("b", kFloat_GrSLType), |
| 1664 GrGLShaderVar("c", kFloat_GrSLType), | 1664 GrGLSLShaderVar("c", kFloat_GrSLType), |
| 1665 GrGLShaderVar("d", kFloat_GrSLType), | 1665 GrGLSLShaderVar("d", kFloat_GrSLType), |
| 1666 GrGLShaderVar("e", kFloat_GrSLType), | 1666 GrGLSLShaderVar("e", kFloat_GrSLType), |
| 1667 GrGLShaderVar("f", kFloat_GrSLType), | 1667 GrGLSLShaderVar("f", kFloat_GrSLType), |
| 1668 GrGLShaderVar("scale", kFloat_GrSLType), | 1668 GrGLSLShaderVar("scale", kFloat_GrSLType), |
| 1669 }; | 1669 }; |
| 1670 SkString sobelFuncName; | 1670 SkString sobelFuncName; |
| 1671 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); | 1671 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); |
| 1672 SkString coords2D = fsBuilder->ensureFSCoords2D(args.fCoords, 0); | 1672 SkString coords2D = fsBuilder->ensureFSCoords2D(args.fCoords, 0); |
| 1673 | 1673 |
| 1674 fsBuilder->emitFunction(kFloat_GrSLType, | 1674 fsBuilder->emitFunction(kFloat_GrSLType, |
| 1675 "sobel", | 1675 "sobel", |
| 1676 SK_ARRAY_COUNT(gSobelArgs), | 1676 SK_ARRAY_COUNT(gSobelArgs), |
| 1677 gSobelArgs, | 1677 gSobelArgs, |
| 1678 "\treturn (-a + b - 2.0 * c + 2.0 * d -e + f) * scal
e;\n", | 1678 "\treturn (-a + b - 2.0 * c + 2.0 * d -e + f) * scal
e;\n", |
| 1679 &sobelFuncName); | 1679 &sobelFuncName); |
| 1680 static const GrGLShaderVar gPointToNormalArgs[] = { | 1680 static const GrGLSLShaderVar gPointToNormalArgs[] = { |
| 1681 GrGLShaderVar("x", kFloat_GrSLType), | 1681 GrGLSLShaderVar("x", kFloat_GrSLType), |
| 1682 GrGLShaderVar("y", kFloat_GrSLType), | 1682 GrGLSLShaderVar("y", kFloat_GrSLType), |
| 1683 GrGLShaderVar("scale", kFloat_GrSLType), | 1683 GrGLSLShaderVar("scale", kFloat_GrSLType), |
| 1684 }; | 1684 }; |
| 1685 SkString pointToNormalName; | 1685 SkString pointToNormalName; |
| 1686 fsBuilder->emitFunction(kVec3f_GrSLType, | 1686 fsBuilder->emitFunction(kVec3f_GrSLType, |
| 1687 "pointToNormal", | 1687 "pointToNormal", |
| 1688 SK_ARRAY_COUNT(gPointToNormalArgs), | 1688 SK_ARRAY_COUNT(gPointToNormalArgs), |
| 1689 gPointToNormalArgs, | 1689 gPointToNormalArgs, |
| 1690 "\treturn normalize(vec3(-x * scale, -y * scale, 1))
;\n", | 1690 "\treturn normalize(vec3(-x * scale, -y * scale, 1))
;\n", |
| 1691 &pointToNormalName); | 1691 &pointToNormalName); |
| 1692 | 1692 |
| 1693 static const GrGLShaderVar gInteriorNormalArgs[] = { | 1693 static const GrGLSLShaderVar gInteriorNormalArgs[] = { |
| 1694 GrGLShaderVar("m", kFloat_GrSLType, 9), | 1694 GrGLSLShaderVar("m", kFloat_GrSLType, 9), |
| 1695 GrGLShaderVar("surfaceScale", kFloat_GrSLType), | 1695 GrGLSLShaderVar("surfaceScale", kFloat_GrSLType), |
| 1696 }; | 1696 }; |
| 1697 SkString normalBody = emitNormalFunc(fBoundaryMode, | 1697 SkString normalBody = emitNormalFunc(fBoundaryMode, |
| 1698 pointToNormalName.c_str(), | 1698 pointToNormalName.c_str(), |
| 1699 sobelFuncName.c_str()); | 1699 sobelFuncName.c_str()); |
| 1700 SkString normalName; | 1700 SkString normalName; |
| 1701 fsBuilder->emitFunction(kVec3f_GrSLType, | 1701 fsBuilder->emitFunction(kVec3f_GrSLType, |
| 1702 "normal", | 1702 "normal", |
| 1703 SK_ARRAY_COUNT(gInteriorNormalArgs), | 1703 SK_ARRAY_COUNT(gInteriorNormalArgs), |
| 1704 gInteriorNormalArgs, | 1704 gInteriorNormalArgs, |
| 1705 normalBody.c_str(), | 1705 normalBody.c_str(), |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1760 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrProcessor& proc) | 1760 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrProcessor& proc) |
| 1761 : INHERITED(proc) { | 1761 : INHERITED(proc) { |
| 1762 } | 1762 } |
| 1763 | 1763 |
| 1764 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLFPBuilder* builder, SkString*
funcName) { | 1764 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLFPBuilder* builder, SkString*
funcName) { |
| 1765 const char* kd; | 1765 const char* kd; |
| 1766 fKDUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1766 fKDUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
| 1767 kFloat_GrSLType, kDefault_GrSLPrecision, | 1767 kFloat_GrSLType, kDefault_GrSLPrecision, |
| 1768 "KD", &kd); | 1768 "KD", &kd); |
| 1769 | 1769 |
| 1770 static const GrGLShaderVar gLightArgs[] = { | 1770 static const GrGLSLShaderVar gLightArgs[] = { |
| 1771 GrGLShaderVar("normal", kVec3f_GrSLType), | 1771 GrGLSLShaderVar("normal", kVec3f_GrSLType), |
| 1772 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), | 1772 GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType), |
| 1773 GrGLShaderVar("lightColor", kVec3f_GrSLType) | 1773 GrGLSLShaderVar("lightColor", kVec3f_GrSLType) |
| 1774 }; | 1774 }; |
| 1775 SkString lightBody; | 1775 SkString lightBody; |
| 1776 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n"
, kd); | 1776 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n"
, kd); |
| 1777 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1
.0);\n"); | 1777 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1
.0);\n"); |
| 1778 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, | 1778 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, |
| 1779 "light", | 1779 "light", |
| 1780 SK_ARRAY_COUNT(gLightArgs)
, | 1780 SK_ARRAY_COUNT(gLightArgs)
, |
| 1781 gLightArgs, | 1781 gLightArgs, |
| 1782 lightBody.c_str(), | 1782 lightBody.c_str(), |
| 1783 funcName); | 1783 funcName); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1848 const char* shininess; | 1848 const char* shininess; |
| 1849 | 1849 |
| 1850 fKSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1850 fKSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
| 1851 kFloat_GrSLType, kDefault_GrSLPrecision, "KS",
&ks); | 1851 kFloat_GrSLType, kDefault_GrSLPrecision, "KS",
&ks); |
| 1852 fShininessUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
, | 1852 fShininessUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
, |
| 1853 kFloat_GrSLType, | 1853 kFloat_GrSLType, |
| 1854 kDefault_GrSLPrecision, | 1854 kDefault_GrSLPrecision, |
| 1855 "Shininess", | 1855 "Shininess", |
| 1856 &shininess); | 1856 &shininess); |
| 1857 | 1857 |
| 1858 static const GrGLShaderVar gLightArgs[] = { | 1858 static const GrGLSLShaderVar gLightArgs[] = { |
| 1859 GrGLShaderVar("normal", kVec3f_GrSLType), | 1859 GrGLSLShaderVar("normal", kVec3f_GrSLType), |
| 1860 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), | 1860 GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType), |
| 1861 GrGLShaderVar("lightColor", kVec3f_GrSLType) | 1861 GrGLSLShaderVar("lightColor", kVec3f_GrSLType) |
| 1862 }; | 1862 }; |
| 1863 SkString lightBody; | 1863 SkString lightBody; |
| 1864 lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0,
0, 1)));\n"); | 1864 lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0,
0, 1)));\n"); |
| 1865 lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\
n", ks, shininess); | 1865 lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\
n", ks, shininess); |
| 1866 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
n"); | 1866 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
n"); |
| 1867 lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b))
;\n"); | 1867 lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b))
;\n"); |
| 1868 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, | 1868 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, |
| 1869 "light", | 1869 "light", |
| 1870 SK_ARRAY_COUNT(gLightArgs)
, | 1870 SK_ARRAY_COUNT(gLightArgs)
, |
| 1871 gLightArgs, | 1871 gLightArgs, |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1980 "CosInnerConeAngle", &cosInner); | 1980 "CosInnerConeAngle", &cosInner); |
| 1981 fCosOuterConeAngleUni = builder->addUniform(GrGLProgramBuilder::kFragment_Vi
sibility, | 1981 fCosOuterConeAngleUni = builder->addUniform(GrGLProgramBuilder::kFragment_Vi
sibility, |
| 1982 kFloat_GrSLType, kDefault_GrSLPr
ecision, | 1982 kFloat_GrSLType, kDefault_GrSLPr
ecision, |
| 1983 "CosOuterConeAngle", &cosOuter); | 1983 "CosOuterConeAngle", &cosOuter); |
| 1984 fConeScaleUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
, | 1984 fConeScaleUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
, |
| 1985 kFloat_GrSLType, kDefault_GrSLPrecision, | 1985 kFloat_GrSLType, kDefault_GrSLPrecision, |
| 1986 "ConeScale", &coneScale); | 1986 "ConeScale", &coneScale); |
| 1987 fSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1987 fSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
| 1988 kVec3f_GrSLType, kDefault_GrSLPrecision, "S", &s
); | 1988 kVec3f_GrSLType, kDefault_GrSLPrecision, "S", &s
); |
| 1989 | 1989 |
| 1990 static const GrGLShaderVar gLightColorArgs[] = { | 1990 static const GrGLSLShaderVar gLightColorArgs[] = { |
| 1991 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType) | 1991 GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType) |
| 1992 }; | 1992 }; |
| 1993 SkString lightColorBody; | 1993 SkString lightColorBody; |
| 1994 lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s); | 1994 lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s); |
| 1995 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter); | 1995 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter); |
| 1996 lightColorBody.appendf("\t\treturn vec3(0);\n"); | 1996 lightColorBody.appendf("\t\treturn vec3(0);\n"); |
| 1997 lightColorBody.appendf("\t}\n"); | 1997 lightColorBody.appendf("\t}\n"); |
| 1998 lightColorBody.appendf("\tfloat scale = pow(cosAngle, %s);\n", exponent); | 1998 lightColorBody.appendf("\tfloat scale = pow(cosAngle, %s);\n", exponent); |
| 1999 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosInner); | 1999 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosInner); |
| 2000 lightColorBody.appendf("\t\treturn %s * scale * (cosAngle - %s) * %s;\n", | 2000 lightColorBody.appendf("\t\treturn %s * scale * (cosAngle - %s) * %s;\n", |
| 2001 color, cosOuter, coneScale); | 2001 color, cosOuter, coneScale); |
| 2002 lightColorBody.appendf("\t}\n"); | 2002 lightColorBody.appendf("\t}\n"); |
| 2003 lightColorBody.appendf("\treturn %s;\n", color); | 2003 lightColorBody.appendf("\treturn %s;\n", color); |
| 2004 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 2004 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
| 2005 fsBuilder->emitFunction(kVec3f_GrSLType, | 2005 fsBuilder->emitFunction(kVec3f_GrSLType, |
| 2006 "lightColor", | 2006 "lightColor", |
| 2007 SK_ARRAY_COUNT(gLightColorArgs), | 2007 SK_ARRAY_COUNT(gLightColorArgs), |
| 2008 gLightColorArgs, | 2008 gLightColorArgs, |
| 2009 lightColorBody.c_str(), | 2009 lightColorBody.c_str(), |
| 2010 &fLightColorFunc); | 2010 &fLightColorFunc); |
| 2011 | 2011 |
| 2012 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 2012 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
| 2013 } | 2013 } |
| 2014 | 2014 |
| 2015 #endif | 2015 #endif |
| 2016 | 2016 |
| 2017 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 2017 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
| 2018 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 2018 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
| 2019 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 2019 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
| 2020 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 2020 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |