| 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 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 583 class SkDistantLight : public SkLight { | 583 class SkDistantLight : public SkLight { |
| 584 public: | 584 public: |
| 585 SkDistantLight(const SkPoint3& direction, SkColor color) | 585 SkDistantLight(const SkPoint3& direction, SkColor color) |
| 586 : INHERITED(color), fDirection(direction) { | 586 : INHERITED(color), fDirection(direction) { |
| 587 } | 587 } |
| 588 | 588 |
| 589 SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const { | 589 SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const { |
| 590 return fDirection; | 590 return fDirection; |
| 591 }; | 591 }; |
| 592 SkPoint3 lightColor(const SkPoint3&) const { return color(); } | 592 SkPoint3 lightColor(const SkPoint3&) const { return color(); } |
| 593 virtual LightType type() const { return kDistant_LightType; } | 593 virtual LightType type() const SK_OVERRIDE { return kDistant_LightType; } |
| 594 const SkPoint3& direction() const { return fDirection; } | 594 const SkPoint3& direction() const { return fDirection; } |
| 595 virtual GrGLLight* createGLLight() const SK_OVERRIDE { | 595 virtual GrGLLight* createGLLight() const SK_OVERRIDE { |
| 596 #if SK_SUPPORT_GPU | 596 #if SK_SUPPORT_GPU |
| 597 return SkNEW(GrGLDistantLight); | 597 return SkNEW(GrGLDistantLight); |
| 598 #else | 598 #else |
| 599 SkDEBUGFAIL("Should not call in GPU-less build"); | 599 SkDEBUGFAIL("Should not call in GPU-less build"); |
| 600 return NULL; | 600 return NULL; |
| 601 #endif | 601 #endif |
| 602 } | 602 } |
| 603 virtual bool requiresFragmentPosition() const SK_OVERRIDE { return false; } | 603 virtual bool requiresFragmentPosition() const SK_OVERRIDE { return false; } |
| 604 | 604 |
| 605 virtual bool isEqual(const SkLight& other) const SK_OVERRIDE { | 605 virtual bool isEqual(const SkLight& other) const SK_OVERRIDE { |
| 606 if (other.type() != kDistant_LightType) { | 606 if (other.type() != kDistant_LightType) { |
| 607 return false; | 607 return false; |
| 608 } | 608 } |
| 609 | 609 |
| 610 const SkDistantLight& o = static_cast<const SkDistantLight&>(other); | 610 const SkDistantLight& o = static_cast<const SkDistantLight&>(other); |
| 611 return INHERITED::isEqual(other) && | 611 return INHERITED::isEqual(other) && |
| 612 fDirection == o.fDirection; | 612 fDirection == o.fDirection; |
| 613 } | 613 } |
| 614 | 614 |
| 615 SkDistantLight(SkReadBuffer& buffer) : INHERITED(buffer) { | 615 SkDistantLight(SkReadBuffer& buffer) : INHERITED(buffer) { |
| 616 fDirection = readPoint3(buffer); | 616 fDirection = readPoint3(buffer); |
| 617 } | 617 } |
| 618 | 618 |
| 619 protected: | 619 protected: |
| 620 SkDistantLight(const SkPoint3& direction, const SkPoint3& color) | 620 SkDistantLight(const SkPoint3& direction, const SkPoint3& color) |
| 621 : INHERITED(color), fDirection(direction) { | 621 : INHERITED(color), fDirection(direction) { |
| 622 } | 622 } |
| 623 virtual SkLight* transform(const SkMatrix& matrix) const { | 623 virtual SkLight* transform(const SkMatrix& matrix) const SK_OVERRIDE { |
| 624 return new SkDistantLight(direction(), color()); | 624 return new SkDistantLight(direction(), color()); |
| 625 } | 625 } |
| 626 virtual void onFlattenLight(SkWriteBuffer& buffer) const SK_OVERRIDE { | 626 virtual void onFlattenLight(SkWriteBuffer& buffer) const SK_OVERRIDE { |
| 627 writePoint3(fDirection, buffer); | 627 writePoint3(fDirection, buffer); |
| 628 } | 628 } |
| 629 | 629 |
| 630 private: | 630 private: |
| 631 typedef SkLight INHERITED; | 631 typedef SkLight INHERITED; |
| 632 SkPoint3 fDirection; | 632 SkPoint3 fDirection; |
| 633 }; | 633 }; |
| 634 | 634 |
| 635 /////////////////////////////////////////////////////////////////////////////// | 635 /////////////////////////////////////////////////////////////////////////////// |
| 636 | 636 |
| 637 class SkPointLight : public SkLight { | 637 class SkPointLight : public SkLight { |
| 638 public: | 638 public: |
| 639 SkPointLight(const SkPoint3& location, SkColor color) | 639 SkPointLight(const SkPoint3& location, SkColor color) |
| 640 : INHERITED(color), fLocation(location) {} | 640 : INHERITED(color), fLocation(location) {} |
| 641 | 641 |
| 642 SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const { | 642 SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const { |
| 643 SkPoint3 direction(fLocation.fX - SkIntToScalar(x), | 643 SkPoint3 direction(fLocation.fX - SkIntToScalar(x), |
| 644 fLocation.fY - SkIntToScalar(y), | 644 fLocation.fY - SkIntToScalar(y), |
| 645 fLocation.fZ - SkScalarMul(SkIntToScalar(z), surfaceS
cale)); | 645 fLocation.fZ - SkScalarMul(SkIntToScalar(z), surfaceS
cale)); |
| 646 direction.normalize(); | 646 direction.normalize(); |
| 647 return direction; | 647 return direction; |
| 648 }; | 648 }; |
| 649 SkPoint3 lightColor(const SkPoint3&) const { return color(); } | 649 SkPoint3 lightColor(const SkPoint3&) const { return color(); } |
| 650 virtual LightType type() const { return kPoint_LightType; } | 650 virtual LightType type() const SK_OVERRIDE { return kPoint_LightType; } |
| 651 const SkPoint3& location() const { return fLocation; } | 651 const SkPoint3& location() const { return fLocation; } |
| 652 virtual GrGLLight* createGLLight() const SK_OVERRIDE { | 652 virtual GrGLLight* createGLLight() const SK_OVERRIDE { |
| 653 #if SK_SUPPORT_GPU | 653 #if SK_SUPPORT_GPU |
| 654 return SkNEW(GrGLPointLight); | 654 return SkNEW(GrGLPointLight); |
| 655 #else | 655 #else |
| 656 SkDEBUGFAIL("Should not call in GPU-less build"); | 656 SkDEBUGFAIL("Should not call in GPU-less build"); |
| 657 return NULL; | 657 return NULL; |
| 658 #endif | 658 #endif |
| 659 } | 659 } |
| 660 virtual bool requiresFragmentPosition() const SK_OVERRIDE { return true; } | 660 virtual bool requiresFragmentPosition() const SK_OVERRIDE { return true; } |
| 661 virtual bool isEqual(const SkLight& other) const SK_OVERRIDE { | 661 virtual bool isEqual(const SkLight& other) const SK_OVERRIDE { |
| 662 if (other.type() != kPoint_LightType) { | 662 if (other.type() != kPoint_LightType) { |
| 663 return false; | 663 return false; |
| 664 } | 664 } |
| 665 const SkPointLight& o = static_cast<const SkPointLight&>(other); | 665 const SkPointLight& o = static_cast<const SkPointLight&>(other); |
| 666 return INHERITED::isEqual(other) && | 666 return INHERITED::isEqual(other) && |
| 667 fLocation == o.fLocation; | 667 fLocation == o.fLocation; |
| 668 } | 668 } |
| 669 virtual SkLight* transform(const SkMatrix& matrix) const { | 669 virtual SkLight* transform(const SkMatrix& matrix) const SK_OVERRIDE { |
| 670 SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY); | 670 SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY); |
| 671 matrix.mapPoints(&location2, 1); | 671 matrix.mapPoints(&location2, 1); |
| 672 // Use X scale and Y scale on Z and average the result | 672 // Use X scale and Y scale on Z and average the result |
| 673 SkPoint locationZ = SkPoint::Make(fLocation.fZ, fLocation.fZ); | 673 SkPoint locationZ = SkPoint::Make(fLocation.fZ, fLocation.fZ); |
| 674 matrix.mapVectors(&locationZ, 1); | 674 matrix.mapVectors(&locationZ, 1); |
| 675 SkPoint3 location(location2.fX, location2.fY, SkScalarAve(locationZ.fX,
locationZ.fY)); | 675 SkPoint3 location(location2.fX, location2.fY, SkScalarAve(locationZ.fX,
locationZ.fY)); |
| 676 return new SkPointLight(location, color()); | 676 return new SkPointLight(location, color()); |
| 677 } | 677 } |
| 678 | 678 |
| 679 SkPointLight(SkReadBuffer& buffer) : INHERITED(buffer) { | 679 SkPointLight(SkReadBuffer& buffer) : INHERITED(buffer) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 703 fSpecularExponent(SkScalarPin(specularExponent, kSpecularExponentMin, kSp
ecularExponentMax)) | 703 fSpecularExponent(SkScalarPin(specularExponent, kSpecularExponentMin, kSp
ecularExponentMax)) |
| 704 { | 704 { |
| 705 fS = target - location; | 705 fS = target - location; |
| 706 fS.normalize(); | 706 fS.normalize(); |
| 707 fCosOuterConeAngle = SkScalarCos(SkDegreesToRadians(cutoffAngle)); | 707 fCosOuterConeAngle = SkScalarCos(SkDegreesToRadians(cutoffAngle)); |
| 708 const SkScalar antiAliasThreshold = 0.016f; | 708 const SkScalar antiAliasThreshold = 0.016f; |
| 709 fCosInnerConeAngle = fCosOuterConeAngle + antiAliasThreshold; | 709 fCosInnerConeAngle = fCosOuterConeAngle + antiAliasThreshold; |
| 710 fConeScale = SkScalarInvert(antiAliasThreshold); | 710 fConeScale = SkScalarInvert(antiAliasThreshold); |
| 711 } | 711 } |
| 712 | 712 |
| 713 virtual SkLight* transform(const SkMatrix& matrix) const { | 713 virtual SkLight* transform(const SkMatrix& matrix) const SK_OVERRIDE { |
| 714 SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY); | 714 SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY); |
| 715 matrix.mapPoints(&location2, 1); | 715 matrix.mapPoints(&location2, 1); |
| 716 // Use X scale and Y scale on Z and average the result | 716 // Use X scale and Y scale on Z and average the result |
| 717 SkPoint locationZ = SkPoint::Make(fLocation.fZ, fLocation.fZ); | 717 SkPoint locationZ = SkPoint::Make(fLocation.fZ, fLocation.fZ); |
| 718 matrix.mapVectors(&locationZ, 1); | 718 matrix.mapVectors(&locationZ, 1); |
| 719 SkPoint3 location(location2.fX, location2.fY, SkScalarAve(locationZ.fX,
locationZ.fY)); | 719 SkPoint3 location(location2.fX, location2.fY, SkScalarAve(locationZ.fX,
locationZ.fY)); |
| 720 SkPoint target2 = SkPoint::Make(fTarget.fX, fTarget.fY); | 720 SkPoint target2 = SkPoint::Make(fTarget.fX, fTarget.fY); |
| 721 matrix.mapPoints(&target2, 1); | 721 matrix.mapPoints(&target2, 1); |
| 722 SkPoint targetZ = SkPoint::Make(fTarget.fZ, fTarget.fZ); | 722 SkPoint targetZ = SkPoint::Make(fTarget.fZ, fTarget.fZ); |
| 723 matrix.mapVectors(&targetZ, 1); | 723 matrix.mapVectors(&targetZ, 1); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 748 } | 748 } |
| 749 virtual GrGLLight* createGLLight() const SK_OVERRIDE { | 749 virtual GrGLLight* createGLLight() const SK_OVERRIDE { |
| 750 #if SK_SUPPORT_GPU | 750 #if SK_SUPPORT_GPU |
| 751 return SkNEW(GrGLSpotLight); | 751 return SkNEW(GrGLSpotLight); |
| 752 #else | 752 #else |
| 753 SkDEBUGFAIL("Should not call in GPU-less build"); | 753 SkDEBUGFAIL("Should not call in GPU-less build"); |
| 754 return NULL; | 754 return NULL; |
| 755 #endif | 755 #endif |
| 756 } | 756 } |
| 757 virtual bool requiresFragmentPosition() const SK_OVERRIDE { return true; } | 757 virtual bool requiresFragmentPosition() const SK_OVERRIDE { return true; } |
| 758 virtual LightType type() const { return kSpot_LightType; } | 758 virtual LightType type() const SK_OVERRIDE { return kSpot_LightType; } |
| 759 const SkPoint3& location() const { return fLocation; } | 759 const SkPoint3& location() const { return fLocation; } |
| 760 const SkPoint3& target() const { return fTarget; } | 760 const SkPoint3& target() const { return fTarget; } |
| 761 SkScalar specularExponent() const { return fSpecularExponent; } | 761 SkScalar specularExponent() const { return fSpecularExponent; } |
| 762 SkScalar cosInnerConeAngle() const { return fCosInnerConeAngle; } | 762 SkScalar cosInnerConeAngle() const { return fCosInnerConeAngle; } |
| 763 SkScalar cosOuterConeAngle() const { return fCosOuterConeAngle; } | 763 SkScalar cosOuterConeAngle() const { return fCosOuterConeAngle; } |
| 764 SkScalar coneScale() const { return fConeScale; } | 764 SkScalar coneScale() const { return fConeScale; } |
| 765 const SkPoint3& s() const { return fS; } | 765 const SkPoint3& s() const { return fS; } |
| 766 | 766 |
| 767 SkSpotLight(SkReadBuffer& buffer) : INHERITED(buffer) { | 767 SkSpotLight(SkReadBuffer& buffer) : INHERITED(buffer) { |
| 768 fLocation = readPoint3(buffer); | 768 fLocation = readPoint3(buffer); |
| (...skipping 929 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1698 | 1698 |
| 1699 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 1699 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
| 1700 } | 1700 } |
| 1701 | 1701 |
| 1702 #endif | 1702 #endif |
| 1703 | 1703 |
| 1704 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 1704 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
| 1705 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 1705 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
| 1706 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 1706 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
| 1707 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1707 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |