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 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 texture, | 526 texture, |
527 light, | 527 light, |
528 surfaceScale, | 528 surfaceScale, |
529 matrix, | 529 matrix, |
530 kd, | 530 kd, |
531 boundaryMode)); | 531 boundaryMode)); |
532 } | 532 } |
533 | 533 |
534 const char* name() const override { return "DiffuseLighting"; } | 534 const char* name() const override { return "DiffuseLighting"; } |
535 | 535 |
536 GrGLFragmentProcessor* createGLInstance() const override; | |
537 | |
538 SkScalar kd() const { return fKD; } | 536 SkScalar kd() const { return fKD; } |
539 | 537 |
540 private: | 538 private: |
| 539 GrGLFragmentProcessor* onCreateGLInstance() const override; |
| 540 |
541 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; | 541 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; |
542 | 542 |
543 bool onIsEqual(const GrFragmentProcessor&) const override; | 543 bool onIsEqual(const GrFragmentProcessor&) const override; |
544 | 544 |
545 GrDiffuseLightingEffect(GrProcessorDataManager*, | 545 GrDiffuseLightingEffect(GrProcessorDataManager*, |
546 GrTexture* texture, | 546 GrTexture* texture, |
547 const SkLight* light, | 547 const SkLight* light, |
548 SkScalar surfaceScale, | 548 SkScalar surfaceScale, |
549 const SkMatrix& matrix, | 549 const SkMatrix& matrix, |
550 SkScalar kd, | 550 SkScalar kd, |
(...skipping 19 matching lines...) Expand all Loading... |
570 light, | 570 light, |
571 surfaceScale, | 571 surfaceScale, |
572 matrix, | 572 matrix, |
573 ks, | 573 ks, |
574 shininess, | 574 shininess, |
575 boundaryMode)); | 575 boundaryMode)); |
576 } | 576 } |
577 | 577 |
578 const char* name() const override { return "SpecularLighting"; } | 578 const char* name() const override { return "SpecularLighting"; } |
579 | 579 |
580 GrGLFragmentProcessor* createGLInstance() const override; | 580 GrGLFragmentProcessor* onCreateGLInstance() const override; |
581 | 581 |
582 SkScalar ks() const { return fKS; } | 582 SkScalar ks() const { return fKS; } |
583 SkScalar shininess() const { return fShininess; } | 583 SkScalar shininess() const { return fShininess; } |
584 | 584 |
585 private: | 585 private: |
586 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; | 586 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; |
587 | 587 |
588 bool onIsEqual(const GrFragmentProcessor&) const override; | 588 bool onIsEqual(const GrFragmentProcessor&) const override; |
589 | 589 |
590 GrSpecularLightingEffect(GrProcessorDataManager*, | 590 GrSpecularLightingEffect(GrProcessorDataManager*, |
(...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1510 | 1510 |
1511 class GrGLLightingEffect : public GrGLFragmentProcessor { | 1511 class GrGLLightingEffect : public GrGLFragmentProcessor { |
1512 public: | 1512 public: |
1513 GrGLLightingEffect(const GrProcessor&); | 1513 GrGLLightingEffect(const GrProcessor&); |
1514 virtual ~GrGLLightingEffect(); | 1514 virtual ~GrGLLightingEffect(); |
1515 | 1515 |
1516 void emitCode(EmitArgs&) override; | 1516 void emitCode(EmitArgs&) override; |
1517 | 1517 |
1518 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder* b); | 1518 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder* b); |
1519 | 1519 |
| 1520 protected: |
1520 /** | 1521 /** |
1521 * Subclasses of GrGLLightingEffect must call INHERITED::setData(); | 1522 * Subclasses of GrGLLightingEffect must call INHERITED::onSetData(); |
1522 */ | 1523 */ |
1523 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 1524 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; |
1524 | 1525 |
1525 protected: | |
1526 virtual void emitLightFunc(GrGLFPBuilder*, SkString* funcName) = 0; | 1526 virtual void emitLightFunc(GrGLFPBuilder*, SkString* funcName) = 0; |
1527 | 1527 |
1528 private: | 1528 private: |
1529 typedef GrGLFragmentProcessor INHERITED; | 1529 typedef GrGLFragmentProcessor INHERITED; |
1530 | 1530 |
1531 UniformHandle fImageIncrementUni; | 1531 UniformHandle fImageIncrementUni; |
1532 UniformHandle fSurfaceScaleUni; | 1532 UniformHandle fSurfaceScaleUni; |
1533 GrGLLight* fLight; | 1533 GrGLLight* fLight; |
1534 BoundaryMode fBoundaryMode; | 1534 BoundaryMode fBoundaryMode; |
1535 }; | 1535 }; |
1536 | 1536 |
1537 /////////////////////////////////////////////////////////////////////////////// | 1537 /////////////////////////////////////////////////////////////////////////////// |
1538 | 1538 |
1539 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { | 1539 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { |
1540 public: | 1540 public: |
1541 GrGLDiffuseLightingEffect(const GrProcessor&); | 1541 GrGLDiffuseLightingEffect(const GrProcessor&); |
1542 void emitLightFunc(GrGLFPBuilder*, SkString* funcName) override; | 1542 void emitLightFunc(GrGLFPBuilder*, SkString* funcName) override; |
1543 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 1543 |
| 1544 protected: |
| 1545 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; |
1544 | 1546 |
1545 private: | 1547 private: |
1546 typedef GrGLLightingEffect INHERITED; | 1548 typedef GrGLLightingEffect INHERITED; |
1547 | 1549 |
1548 UniformHandle fKDUni; | 1550 UniformHandle fKDUni; |
1549 }; | 1551 }; |
1550 | 1552 |
1551 /////////////////////////////////////////////////////////////////////////////// | 1553 /////////////////////////////////////////////////////////////////////////////// |
1552 | 1554 |
1553 class GrGLSpecularLightingEffect : public GrGLLightingEffect { | 1555 class GrGLSpecularLightingEffect : public GrGLLightingEffect { |
1554 public: | 1556 public: |
1555 GrGLSpecularLightingEffect(const GrProcessor&); | 1557 GrGLSpecularLightingEffect(const GrProcessor&); |
1556 void emitLightFunc(GrGLFPBuilder*, SkString* funcName) override; | 1558 void emitLightFunc(GrGLFPBuilder*, SkString* funcName) override; |
1557 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 1559 |
| 1560 protected: |
| 1561 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; |
1558 | 1562 |
1559 private: | 1563 private: |
1560 typedef GrGLLightingEffect INHERITED; | 1564 typedef GrGLLightingEffect INHERITED; |
1561 | 1565 |
1562 UniformHandle fKSUni; | 1566 UniformHandle fKSUni; |
1563 UniformHandle fShininessUni; | 1567 UniformHandle fShininessUni; |
1564 }; | 1568 }; |
1565 | 1569 |
1566 /////////////////////////////////////////////////////////////////////////////// | 1570 /////////////////////////////////////////////////////////////////////////////// |
1567 | 1571 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1610 const GrDiffuseLightingEffect& s = sBase.cast<GrDiffuseLightingEffect>(); | 1614 const GrDiffuseLightingEffect& s = sBase.cast<GrDiffuseLightingEffect>(); |
1611 return INHERITED::onIsEqual(sBase) && | 1615 return INHERITED::onIsEqual(sBase) && |
1612 this->kd() == s.kd(); | 1616 this->kd() == s.kd(); |
1613 } | 1617 } |
1614 | 1618 |
1615 void GrDiffuseLightingEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, | 1619 void GrDiffuseLightingEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, |
1616 GrProcessorKeyBuilder* b) const
{ | 1620 GrProcessorKeyBuilder* b) const
{ |
1617 GrGLDiffuseLightingEffect::GenKey(*this, caps, b); | 1621 GrGLDiffuseLightingEffect::GenKey(*this, caps, b); |
1618 } | 1622 } |
1619 | 1623 |
1620 GrGLFragmentProcessor* GrDiffuseLightingEffect::createGLInstance() const { | 1624 GrGLFragmentProcessor* GrDiffuseLightingEffect::onCreateGLInstance() const { |
1621 return SkNEW_ARGS(GrGLDiffuseLightingEffect, (*this)); | 1625 return SkNEW_ARGS(GrGLDiffuseLightingEffect, (*this)); |
1622 } | 1626 } |
1623 | 1627 |
1624 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrDiffuseLightingEffect); | 1628 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrDiffuseLightingEffect); |
1625 | 1629 |
1626 GrFragmentProcessor* GrDiffuseLightingEffect::TestCreate(GrProcessorTestData* d)
{ | 1630 GrFragmentProcessor* GrDiffuseLightingEffect::TestCreate(GrProcessorTestData* d)
{ |
1627 SkScalar surfaceScale = d->fRandom->nextSScalar1(); | 1631 SkScalar surfaceScale = d->fRandom->nextSScalar1(); |
1628 SkScalar kd = d->fRandom->nextUScalar1(); | 1632 SkScalar kd = d->fRandom->nextUScalar1(); |
1629 SkAutoTUnref<SkLight> light(create_random_light(d->fRandom)); | 1633 SkAutoTUnref<SkLight> light(create_random_light(d->fRandom)); |
1630 SkMatrix matrix; | 1634 SkMatrix matrix; |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1736 GrGLSLMulVarBy4f(&modulate, args.fOutputColor, args.fInputColor); | 1740 GrGLSLMulVarBy4f(&modulate, args.fOutputColor, args.fInputColor); |
1737 fsBuilder->codeAppend(modulate.c_str()); | 1741 fsBuilder->codeAppend(modulate.c_str()); |
1738 } | 1742 } |
1739 | 1743 |
1740 void GrGLLightingEffect::GenKey(const GrProcessor& proc, | 1744 void GrGLLightingEffect::GenKey(const GrProcessor& proc, |
1741 const GrGLSLCaps& caps, GrProcessorKeyBuilder* b
) { | 1745 const GrGLSLCaps& caps, GrProcessorKeyBuilder* b
) { |
1742 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); | 1746 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); |
1743 b->add32(lighting.boundaryMode() << 2 | lighting.light()->type()); | 1747 b->add32(lighting.boundaryMode() << 2 | lighting.light()->type()); |
1744 } | 1748 } |
1745 | 1749 |
1746 void GrGLLightingEffect::setData(const GrGLProgramDataManager& pdman, | 1750 void GrGLLightingEffect::onSetData(const GrGLProgramDataManager& pdman, |
1747 const GrProcessor& proc) { | 1751 const GrProcessor& proc) { |
1748 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); | 1752 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); |
1749 GrTexture* texture = lighting.texture(0); | 1753 GrTexture* texture = lighting.texture(0); |
1750 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; | 1754 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; |
1751 pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->he
ight()); | 1755 pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->he
ight()); |
1752 pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); | 1756 pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); |
1753 SkAutoTUnref<SkLight> transformedLight(lighting.light()->transform(lighting.
filterMatrix())); | 1757 SkAutoTUnref<SkLight> transformedLight(lighting.light()->transform(lighting.
filterMatrix())); |
1754 fLight->setData(pdman, transformedLight); | 1758 fLight->setData(pdman, transformedLight); |
1755 } | 1759 } |
1756 | 1760 |
(...skipping 20 matching lines...) Expand all Loading... |
1777 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n"
, kd); | 1781 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n"
, kd); |
1778 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1
.0);\n"); | 1782 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1
.0);\n"); |
1779 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, | 1783 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, |
1780 "light", | 1784 "light", |
1781 SK_ARRAY_COUNT(gLightArgs)
, | 1785 SK_ARRAY_COUNT(gLightArgs)
, |
1782 gLightArgs, | 1786 gLightArgs, |
1783 lightBody.c_str(), | 1787 lightBody.c_str(), |
1784 funcName); | 1788 funcName); |
1785 } | 1789 } |
1786 | 1790 |
1787 void GrGLDiffuseLightingEffect::setData(const GrGLProgramDataManager& pdman, | 1791 void GrGLDiffuseLightingEffect::onSetData(const GrGLProgramDataManager& pdman, |
1788 const GrProcessor& proc) { | 1792 const GrProcessor& proc) { |
1789 INHERITED::setData(pdman, proc); | 1793 INHERITED::onSetData(pdman, proc); |
1790 const GrDiffuseLightingEffect& diffuse = proc.cast<GrDiffuseLightingEffect>(
); | 1794 const GrDiffuseLightingEffect& diffuse = proc.cast<GrDiffuseLightingEffect>(
); |
1791 pdman.set1f(fKDUni, diffuse.kd()); | 1795 pdman.set1f(fKDUni, diffuse.kd()); |
1792 } | 1796 } |
1793 | 1797 |
1794 /////////////////////////////////////////////////////////////////////////////// | 1798 /////////////////////////////////////////////////////////////////////////////// |
1795 | 1799 |
1796 GrSpecularLightingEffect::GrSpecularLightingEffect(GrProcessorDataManager* procD
ataManager, | 1800 GrSpecularLightingEffect::GrSpecularLightingEffect(GrProcessorDataManager* procD
ataManager, |
1797 GrTexture* texture, | 1801 GrTexture* texture, |
1798 const SkLight* light, | 1802 const SkLight* light, |
1799 SkScalar surfaceScale, | 1803 SkScalar surfaceScale, |
(...skipping 12 matching lines...) Expand all Loading... |
1812 return INHERITED::onIsEqual(sBase) && | 1816 return INHERITED::onIsEqual(sBase) && |
1813 this->ks() == s.ks() && | 1817 this->ks() == s.ks() && |
1814 this->shininess() == s.shininess(); | 1818 this->shininess() == s.shininess(); |
1815 } | 1819 } |
1816 | 1820 |
1817 void GrSpecularLightingEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, | 1821 void GrSpecularLightingEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, |
1818 GrProcessorKeyBuilder* b) const
{ | 1822 GrProcessorKeyBuilder* b) const
{ |
1819 GrGLSpecularLightingEffect::GenKey(*this, caps, b); | 1823 GrGLSpecularLightingEffect::GenKey(*this, caps, b); |
1820 } | 1824 } |
1821 | 1825 |
1822 GrGLFragmentProcessor* GrSpecularLightingEffect::createGLInstance() const { | 1826 GrGLFragmentProcessor* GrSpecularLightingEffect::onCreateGLInstance() const { |
1823 return SkNEW_ARGS(GrGLSpecularLightingEffect, (*this)); | 1827 return SkNEW_ARGS(GrGLSpecularLightingEffect, (*this)); |
1824 } | 1828 } |
1825 | 1829 |
1826 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSpecularLightingEffect); | 1830 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSpecularLightingEffect); |
1827 | 1831 |
1828 GrFragmentProcessor* GrSpecularLightingEffect::TestCreate(GrProcessorTestData* d
) { | 1832 GrFragmentProcessor* GrSpecularLightingEffect::TestCreate(GrProcessorTestData* d
) { |
1829 SkScalar surfaceScale = d->fRandom->nextSScalar1(); | 1833 SkScalar surfaceScale = d->fRandom->nextSScalar1(); |
1830 SkScalar ks = d->fRandom->nextUScalar1(); | 1834 SkScalar ks = d->fRandom->nextUScalar1(); |
1831 SkScalar shininess = d->fRandom->nextUScalar1(); | 1835 SkScalar shininess = d->fRandom->nextUScalar1(); |
1832 SkAutoTUnref<SkLight> light(create_random_light(d->fRandom)); | 1836 SkAutoTUnref<SkLight> light(create_random_light(d->fRandom)); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1869 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
n"); | 1873 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
n"); |
1870 lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b))
;\n"); | 1874 lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b))
;\n"); |
1871 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, | 1875 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, |
1872 "light", | 1876 "light", |
1873 SK_ARRAY_COUNT(gLightArgs)
, | 1877 SK_ARRAY_COUNT(gLightArgs)
, |
1874 gLightArgs, | 1878 gLightArgs, |
1875 lightBody.c_str(), | 1879 lightBody.c_str(), |
1876 funcName); | 1880 funcName); |
1877 } | 1881 } |
1878 | 1882 |
1879 void GrGLSpecularLightingEffect::setData(const GrGLProgramDataManager& pdman, | 1883 void GrGLSpecularLightingEffect::onSetData(const GrGLProgramDataManager& pdman, |
1880 const GrProcessor& effect) { | 1884 const GrProcessor& effect) { |
1881 INHERITED::setData(pdman, effect); | 1885 INHERITED::onSetData(pdman, effect); |
1882 const GrSpecularLightingEffect& spec = effect.cast<GrSpecularLightingEffect>
(); | 1886 const GrSpecularLightingEffect& spec = effect.cast<GrSpecularLightingEffect>
(); |
1883 pdman.set1f(fKSUni, spec.ks()); | 1887 pdman.set1f(fKSUni, spec.ks()); |
1884 pdman.set1f(fShininessUni, spec.shininess()); | 1888 pdman.set1f(fShininessUni, spec.shininess()); |
1885 } | 1889 } |
1886 | 1890 |
1887 /////////////////////////////////////////////////////////////////////////////// | 1891 /////////////////////////////////////////////////////////////////////////////// |
1888 void GrGLLight::emitLightColorUniform(GrGLFPBuilder* builder) { | 1892 void GrGLLight::emitLightColorUniform(GrGLFPBuilder* builder) { |
1889 fColorUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1893 fColorUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
1890 kVec3f_GrSLType, kDefault_GrSLPrecision, | 1894 kVec3f_GrSLType, kDefault_GrSLPrecision, |
1891 "LightColor"); | 1895 "LightColor"); |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2013 | 2017 |
2014 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 2018 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
2015 } | 2019 } |
2016 | 2020 |
2017 #endif | 2021 #endif |
2018 | 2022 |
2019 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 2023 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
2020 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 2024 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
2021 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 2025 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
2022 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 2026 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |