| 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" |
| 11 #include "SkFlattenableBuffers.h" | 11 #include "SkReadBuffer.h" |
| 12 #include "SkOrderedReadBuffer.h" | 12 #include "SkWriteBuffer.h" |
| 13 #include "SkOrderedWriteBuffer.h" | 13 #include "SkReadBuffer.h" |
| 14 #include "SkWriteBuffer.h" |
| 14 #include "SkTypes.h" | 15 #include "SkTypes.h" |
| 15 | 16 |
| 16 #if SK_SUPPORT_GPU | 17 #if SK_SUPPORT_GPU |
| 17 #include "effects/GrSingleTextureEffect.h" | 18 #include "effects/GrSingleTextureEffect.h" |
| 18 #include "gl/GrGLEffect.h" | 19 #include "gl/GrGLEffect.h" |
| 19 #include "GrEffect.h" | 20 #include "GrEffect.h" |
| 20 #include "GrTBackendEffectFactory.h" | 21 #include "GrTBackendEffectFactory.h" |
| 21 | 22 |
| 22 class GrGLDiffuseLightingEffect; | 23 class GrGLDiffuseLightingEffect; |
| 23 class GrGLSpecularLightingEffect; | 24 class GrGLSpecularLightingEffect; |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 m[5] = SkGetPackedA32(*row1++); | 237 m[5] = SkGetPackedA32(*row1++); |
| 237 surfaceToLight = l->surfaceToLight(x, y, m[4], surfaceScale); | 238 surfaceToLight = l->surfaceToLight(x, y, m[4], surfaceScale); |
| 238 *dptr++ = lightingType.light(bottomNormal(m, surfaceScale), surfaceT
oLight, l->lightColor(surfaceToLight)); | 239 *dptr++ = lightingType.light(bottomNormal(m, surfaceScale), surfaceT
oLight, l->lightColor(surfaceToLight)); |
| 239 } | 240 } |
| 240 shiftMatrixLeft(m); | 241 shiftMatrixLeft(m); |
| 241 surfaceToLight = l->surfaceToLight(x, y, m[4], surfaceScale); | 242 surfaceToLight = l->surfaceToLight(x, y, m[4], surfaceScale); |
| 242 *dptr++ = lightingType.light(bottomRightNormal(m, surfaceScale), surface
ToLight, l->lightColor(surfaceToLight)); | 243 *dptr++ = lightingType.light(bottomRightNormal(m, surfaceScale), surface
ToLight, l->lightColor(surfaceToLight)); |
| 243 } | 244 } |
| 244 } | 245 } |
| 245 | 246 |
| 246 SkPoint3 readPoint3(SkFlattenableReadBuffer& buffer) { | 247 SkPoint3 readPoint3(SkReadBuffer& buffer) { |
| 247 SkPoint3 point; | 248 SkPoint3 point; |
| 248 point.fX = buffer.readScalar(); | 249 point.fX = buffer.readScalar(); |
| 249 point.fY = buffer.readScalar(); | 250 point.fY = buffer.readScalar(); |
| 250 point.fZ = buffer.readScalar(); | 251 point.fZ = buffer.readScalar(); |
| 251 buffer.validate(SkScalarIsFinite(point.fX) && | 252 buffer.validate(SkScalarIsFinite(point.fX) && |
| 252 SkScalarIsFinite(point.fY) && | 253 SkScalarIsFinite(point.fY) && |
| 253 SkScalarIsFinite(point.fZ)); | 254 SkScalarIsFinite(point.fZ)); |
| 254 return point; | 255 return point; |
| 255 }; | 256 }; |
| 256 | 257 |
| 257 void writePoint3(const SkPoint3& point, SkFlattenableWriteBuffer& buffer) { | 258 void writePoint3(const SkPoint3& point, SkWriteBuffer& buffer) { |
| 258 buffer.writeScalar(point.fX); | 259 buffer.writeScalar(point.fX); |
| 259 buffer.writeScalar(point.fY); | 260 buffer.writeScalar(point.fY); |
| 260 buffer.writeScalar(point.fZ); | 261 buffer.writeScalar(point.fZ); |
| 261 }; | 262 }; |
| 262 | 263 |
| 263 class SkDiffuseLightingImageFilter : public SkLightingImageFilter { | 264 class SkDiffuseLightingImageFilter : public SkLightingImageFilter { |
| 264 public: | 265 public: |
| 265 SkDiffuseLightingImageFilter(SkLight* light, SkScalar surfaceScale, | 266 SkDiffuseLightingImageFilter(SkLight* light, SkScalar surfaceScale, |
| 266 SkScalar kd, SkImageFilter* input, const CropRe
ct* cropRect); | 267 SkScalar kd, SkImageFilter* input, const CropRe
ct* cropRect); |
| 267 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDiffuseLightingImageFi
lter) | 268 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDiffuseLightingImageFi
lter) |
| 268 SkScalar kd() const { return fKD; } | 269 SkScalar kd() const { return fKD; } |
| 269 | 270 |
| 270 protected: | 271 protected: |
| 271 explicit SkDiffuseLightingImageFilter(SkFlattenableReadBuffer& buffer); | 272 explicit SkDiffuseLightingImageFilter(SkReadBuffer& buffer); |
| 272 virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE; | 273 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE; |
| 273 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&, | 274 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&, |
| 274 SkBitmap* result, SkIPoint* offset) SK_OVERRIDE; | 275 SkBitmap* result, SkIPoint* offset) SK_OVERRIDE; |
| 275 #if SK_SUPPORT_GPU | 276 #if SK_SUPPORT_GPU |
| 276 virtual bool asNewEffect(GrEffectRef** effect, GrTexture*, const SkMatrix& m
atrix, const SkIRect& bounds) const SK_OVERRIDE; | 277 virtual bool asNewEffect(GrEffectRef** effect, GrTexture*, const SkMatrix& m
atrix, const SkIRect& bounds) const SK_OVERRIDE; |
| 277 #endif | 278 #endif |
| 278 | 279 |
| 279 private: | 280 private: |
| 280 typedef SkLightingImageFilter INHERITED; | 281 typedef SkLightingImageFilter INHERITED; |
| 281 SkScalar fKD; | 282 SkScalar fKD; |
| 282 }; | 283 }; |
| 283 | 284 |
| 284 class SkSpecularLightingImageFilter : public SkLightingImageFilter { | 285 class SkSpecularLightingImageFilter : public SkLightingImageFilter { |
| 285 public: | 286 public: |
| 286 SkSpecularLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkScala
r ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropRect); | 287 SkSpecularLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkScala
r ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropRect); |
| 287 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpecularLightingImageF
ilter) | 288 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpecularLightingImageF
ilter) |
| 288 | 289 |
| 289 SkScalar ks() const { return fKS; } | 290 SkScalar ks() const { return fKS; } |
| 290 SkScalar shininess() const { return fShininess; } | 291 SkScalar shininess() const { return fShininess; } |
| 291 | 292 |
| 292 protected: | 293 protected: |
| 293 explicit SkSpecularLightingImageFilter(SkFlattenableReadBuffer& buffer); | 294 explicit SkSpecularLightingImageFilter(SkReadBuffer& buffer); |
| 294 virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE; | 295 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE; |
| 295 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&, | 296 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&, |
| 296 SkBitmap* result, SkIPoint* offset) SK_OVERRIDE; | 297 SkBitmap* result, SkIPoint* offset) SK_OVERRIDE; |
| 297 #if SK_SUPPORT_GPU | 298 #if SK_SUPPORT_GPU |
| 298 virtual bool asNewEffect(GrEffectRef** effect, GrTexture*, const SkMatrix& m
atrix, const SkIRect& bounds) const SK_OVERRIDE; | 299 virtual bool asNewEffect(GrEffectRef** effect, GrTexture*, const SkMatrix& m
atrix, const SkIRect& bounds) const SK_OVERRIDE; |
| 299 #endif | 300 #endif |
| 300 | 301 |
| 301 private: | 302 private: |
| 302 typedef SkLightingImageFilter INHERITED; | 303 typedef SkLightingImageFilter INHERITED; |
| 303 SkScalar fKS; | 304 SkScalar fKS; |
| 304 SkScalar fShininess; | 305 SkScalar fShininess; |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 520 const SkPoint3& color() const { return fColor; } | 521 const SkPoint3& color() const { return fColor; } |
| 521 virtual GrGLLight* createGLLight() const = 0; | 522 virtual GrGLLight* createGLLight() const = 0; |
| 522 virtual bool isEqual(const SkLight& other) const { | 523 virtual bool isEqual(const SkLight& other) const { |
| 523 return fColor == other.fColor; | 524 return fColor == other.fColor; |
| 524 } | 525 } |
| 525 // Called to know whether the generated GrGLLight will require access to the
fragment position. | 526 // Called to know whether the generated GrGLLight will require access to the
fragment position. |
| 526 virtual bool requiresFragmentPosition() const = 0; | 527 virtual bool requiresFragmentPosition() const = 0; |
| 527 virtual SkLight* transform(const SkMatrix& matrix) const = 0; | 528 virtual SkLight* transform(const SkMatrix& matrix) const = 0; |
| 528 | 529 |
| 529 // Defined below SkLight's subclasses. | 530 // Defined below SkLight's subclasses. |
| 530 void flattenLight(SkFlattenableWriteBuffer& buffer) const; | 531 void flattenLight(SkWriteBuffer& buffer) const; |
| 531 static SkLight* UnflattenLight(SkFlattenableReadBuffer& buffer); | 532 static SkLight* UnflattenLight(SkReadBuffer& buffer); |
| 532 | 533 |
| 533 protected: | 534 protected: |
| 534 SkLight(SkColor color) | 535 SkLight(SkColor color) |
| 535 : fColor(SkIntToScalar(SkColorGetR(color)), | 536 : fColor(SkIntToScalar(SkColorGetR(color)), |
| 536 SkIntToScalar(SkColorGetG(color)), | 537 SkIntToScalar(SkColorGetG(color)), |
| 537 SkIntToScalar(SkColorGetB(color))) {} | 538 SkIntToScalar(SkColorGetB(color))) {} |
| 538 SkLight(const SkPoint3& color) | 539 SkLight(const SkPoint3& color) |
| 539 : fColor(color) {} | 540 : fColor(color) {} |
| 540 SkLight(SkFlattenableReadBuffer& buffer) { | 541 SkLight(SkReadBuffer& buffer) { |
| 541 fColor = readPoint3(buffer); | 542 fColor = readPoint3(buffer); |
| 542 } | 543 } |
| 543 | 544 |
| 544 virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const = 0; | 545 virtual void onFlattenLight(SkWriteBuffer& buffer) const = 0; |
| 545 | 546 |
| 546 | 547 |
| 547 private: | 548 private: |
| 548 typedef SkRefCnt INHERITED; | 549 typedef SkRefCnt INHERITED; |
| 549 SkPoint3 fColor; | 550 SkPoint3 fColor; |
| 550 }; | 551 }; |
| 551 | 552 |
| 552 /////////////////////////////////////////////////////////////////////////////// | 553 /////////////////////////////////////////////////////////////////////////////// |
| 553 | 554 |
| 554 class SkDistantLight : public SkLight { | 555 class SkDistantLight : public SkLight { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 576 virtual bool isEqual(const SkLight& other) const SK_OVERRIDE { | 577 virtual bool isEqual(const SkLight& other) const SK_OVERRIDE { |
| 577 if (other.type() != kDistant_LightType) { | 578 if (other.type() != kDistant_LightType) { |
| 578 return false; | 579 return false; |
| 579 } | 580 } |
| 580 | 581 |
| 581 const SkDistantLight& o = static_cast<const SkDistantLight&>(other); | 582 const SkDistantLight& o = static_cast<const SkDistantLight&>(other); |
| 582 return INHERITED::isEqual(other) && | 583 return INHERITED::isEqual(other) && |
| 583 fDirection == o.fDirection; | 584 fDirection == o.fDirection; |
| 584 } | 585 } |
| 585 | 586 |
| 586 SkDistantLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { | 587 SkDistantLight(SkReadBuffer& buffer) : INHERITED(buffer) { |
| 587 fDirection = readPoint3(buffer); | 588 fDirection = readPoint3(buffer); |
| 588 } | 589 } |
| 589 | 590 |
| 590 protected: | 591 protected: |
| 591 SkDistantLight(const SkPoint3& direction, const SkPoint3& color) | 592 SkDistantLight(const SkPoint3& direction, const SkPoint3& color) |
| 592 : INHERITED(color), fDirection(direction) { | 593 : INHERITED(color), fDirection(direction) { |
| 593 } | 594 } |
| 594 virtual SkLight* transform(const SkMatrix& matrix) const { | 595 virtual SkLight* transform(const SkMatrix& matrix) const { |
| 595 return new SkDistantLight(direction(), color()); | 596 return new SkDistantLight(direction(), color()); |
| 596 } | 597 } |
| 597 virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const SK_OVERR
IDE { | 598 virtual void onFlattenLight(SkWriteBuffer& buffer) const SK_OVERRIDE { |
| 598 writePoint3(fDirection, buffer); | 599 writePoint3(fDirection, buffer); |
| 599 } | 600 } |
| 600 | 601 |
| 601 private: | 602 private: |
| 602 typedef SkLight INHERITED; | 603 typedef SkLight INHERITED; |
| 603 SkPoint3 fDirection; | 604 SkPoint3 fDirection; |
| 604 }; | 605 }; |
| 605 | 606 |
| 606 /////////////////////////////////////////////////////////////////////////////// | 607 /////////////////////////////////////////////////////////////////////////////// |
| 607 | 608 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 637 return INHERITED::isEqual(other) && | 638 return INHERITED::isEqual(other) && |
| 638 fLocation == o.fLocation; | 639 fLocation == o.fLocation; |
| 639 } | 640 } |
| 640 virtual SkLight* transform(const SkMatrix& matrix) const { | 641 virtual SkLight* transform(const SkMatrix& matrix) const { |
| 641 SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY); | 642 SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY); |
| 642 matrix.mapPoints(&location2, 1); | 643 matrix.mapPoints(&location2, 1); |
| 643 SkPoint3 location(location2.fX, location2.fY, fLocation.fZ); | 644 SkPoint3 location(location2.fX, location2.fY, fLocation.fZ); |
| 644 return new SkPointLight(location, color()); | 645 return new SkPointLight(location, color()); |
| 645 } | 646 } |
| 646 | 647 |
| 647 SkPointLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { | 648 SkPointLight(SkReadBuffer& buffer) : INHERITED(buffer) { |
| 648 fLocation = readPoint3(buffer); | 649 fLocation = readPoint3(buffer); |
| 649 } | 650 } |
| 650 | 651 |
| 651 protected: | 652 protected: |
| 652 SkPointLight(const SkPoint3& location, const SkPoint3& color) | 653 SkPointLight(const SkPoint3& location, const SkPoint3& color) |
| 653 : INHERITED(color), fLocation(location) {} | 654 : INHERITED(color), fLocation(location) {} |
| 654 virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const SK_OVERR
IDE { | 655 virtual void onFlattenLight(SkWriteBuffer& buffer) const SK_OVERRIDE { |
| 655 writePoint3(fLocation, buffer); | 656 writePoint3(fLocation, buffer); |
| 656 } | 657 } |
| 657 | 658 |
| 658 private: | 659 private: |
| 659 typedef SkLight INHERITED; | 660 typedef SkLight INHERITED; |
| 660 SkPoint3 fLocation; | 661 SkPoint3 fLocation; |
| 661 }; | 662 }; |
| 662 | 663 |
| 663 /////////////////////////////////////////////////////////////////////////////// | 664 /////////////////////////////////////////////////////////////////////////////// |
| 664 | 665 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 718 virtual bool requiresFragmentPosition() const SK_OVERRIDE { return true; } | 719 virtual bool requiresFragmentPosition() const SK_OVERRIDE { return true; } |
| 719 virtual LightType type() const { return kSpot_LightType; } | 720 virtual LightType type() const { return kSpot_LightType; } |
| 720 const SkPoint3& location() const { return fLocation; } | 721 const SkPoint3& location() const { return fLocation; } |
| 721 const SkPoint3& target() const { return fTarget; } | 722 const SkPoint3& target() const { return fTarget; } |
| 722 SkScalar specularExponent() const { return fSpecularExponent; } | 723 SkScalar specularExponent() const { return fSpecularExponent; } |
| 723 SkScalar cosInnerConeAngle() const { return fCosInnerConeAngle; } | 724 SkScalar cosInnerConeAngle() const { return fCosInnerConeAngle; } |
| 724 SkScalar cosOuterConeAngle() const { return fCosOuterConeAngle; } | 725 SkScalar cosOuterConeAngle() const { return fCosOuterConeAngle; } |
| 725 SkScalar coneScale() const { return fConeScale; } | 726 SkScalar coneScale() const { return fConeScale; } |
| 726 const SkPoint3& s() const { return fS; } | 727 const SkPoint3& s() const { return fS; } |
| 727 | 728 |
| 728 SkSpotLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { | 729 SkSpotLight(SkReadBuffer& buffer) : INHERITED(buffer) { |
| 729 fLocation = readPoint3(buffer); | 730 fLocation = readPoint3(buffer); |
| 730 fTarget = readPoint3(buffer); | 731 fTarget = readPoint3(buffer); |
| 731 fSpecularExponent = buffer.readScalar(); | 732 fSpecularExponent = buffer.readScalar(); |
| 732 fCosOuterConeAngle = buffer.readScalar(); | 733 fCosOuterConeAngle = buffer.readScalar(); |
| 733 fCosInnerConeAngle = buffer.readScalar(); | 734 fCosInnerConeAngle = buffer.readScalar(); |
| 734 fConeScale = buffer.readScalar(); | 735 fConeScale = buffer.readScalar(); |
| 735 fS = readPoint3(buffer); | 736 fS = readPoint3(buffer); |
| 736 buffer.validate(SkScalarIsFinite(fSpecularExponent) && | 737 buffer.validate(SkScalarIsFinite(fSpecularExponent) && |
| 737 SkScalarIsFinite(fCosOuterConeAngle) && | 738 SkScalarIsFinite(fCosOuterConeAngle) && |
| 738 SkScalarIsFinite(fCosInnerConeAngle) && | 739 SkScalarIsFinite(fCosInnerConeAngle) && |
| 739 SkScalarIsFinite(fConeScale)); | 740 SkScalarIsFinite(fConeScale)); |
| 740 } | 741 } |
| 741 protected: | 742 protected: |
| 742 SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu
larExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar co
neScale, const SkPoint3& s, const SkPoint3& color) | 743 SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu
larExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar co
neScale, const SkPoint3& s, const SkPoint3& color) |
| 743 : INHERITED(color), | 744 : INHERITED(color), |
| 744 fLocation(location), | 745 fLocation(location), |
| 745 fTarget(target), | 746 fTarget(target), |
| 746 fSpecularExponent(specularExponent), | 747 fSpecularExponent(specularExponent), |
| 747 fCosOuterConeAngle(cosOuterConeAngle), | 748 fCosOuterConeAngle(cosOuterConeAngle), |
| 748 fCosInnerConeAngle(cosInnerConeAngle), | 749 fCosInnerConeAngle(cosInnerConeAngle), |
| 749 fConeScale(coneScale), | 750 fConeScale(coneScale), |
| 750 fS(s) | 751 fS(s) |
| 751 { | 752 { |
| 752 } | 753 } |
| 753 virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const SK_OVERR
IDE { | 754 virtual void onFlattenLight(SkWriteBuffer& buffer) const SK_OVERRIDE { |
| 754 writePoint3(fLocation, buffer); | 755 writePoint3(fLocation, buffer); |
| 755 writePoint3(fTarget, buffer); | 756 writePoint3(fTarget, buffer); |
| 756 buffer.writeScalar(fSpecularExponent); | 757 buffer.writeScalar(fSpecularExponent); |
| 757 buffer.writeScalar(fCosOuterConeAngle); | 758 buffer.writeScalar(fCosOuterConeAngle); |
| 758 buffer.writeScalar(fCosInnerConeAngle); | 759 buffer.writeScalar(fCosInnerConeAngle); |
| 759 buffer.writeScalar(fConeScale); | 760 buffer.writeScalar(fConeScale); |
| 760 writePoint3(fS, buffer); | 761 writePoint3(fS, buffer); |
| 761 } | 762 } |
| 762 | 763 |
| 763 virtual bool isEqual(const SkLight& other) const SK_OVERRIDE { | 764 virtual bool isEqual(const SkLight& other) const SK_OVERRIDE { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 787 SkPoint3 fS; | 788 SkPoint3 fS; |
| 788 }; | 789 }; |
| 789 | 790 |
| 790 // According to the spec, the specular term should be in the range [1, 128] : | 791 // According to the spec, the specular term should be in the range [1, 128] : |
| 791 // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingSpecularExponentAttri
bute | 792 // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingSpecularExponentAttri
bute |
| 792 const SkScalar SkSpotLight::kSpecularExponentMin = 1.0f; | 793 const SkScalar SkSpotLight::kSpecularExponentMin = 1.0f; |
| 793 const SkScalar SkSpotLight::kSpecularExponentMax = 128.0f; | 794 const SkScalar SkSpotLight::kSpecularExponentMax = 128.0f; |
| 794 | 795 |
| 795 /////////////////////////////////////////////////////////////////////////////// | 796 /////////////////////////////////////////////////////////////////////////////// |
| 796 | 797 |
| 797 void SkLight::flattenLight(SkFlattenableWriteBuffer& buffer) const { | 798 void SkLight::flattenLight(SkWriteBuffer& buffer) const { |
| 798 // Write type first, then baseclass, then subclass. | 799 // Write type first, then baseclass, then subclass. |
| 799 buffer.writeInt(this->type()); | 800 buffer.writeInt(this->type()); |
| 800 writePoint3(fColor, buffer); | 801 writePoint3(fColor, buffer); |
| 801 this->onFlattenLight(buffer); | 802 this->onFlattenLight(buffer); |
| 802 } | 803 } |
| 803 | 804 |
| 804 /*static*/ SkLight* SkLight::UnflattenLight(SkFlattenableReadBuffer& buffer) { | 805 /*static*/ SkLight* SkLight::UnflattenLight(SkReadBuffer& buffer) { |
| 805 // Read type first. | 806 // Read type first. |
| 806 const SkLight::LightType type = (SkLight::LightType)buffer.readInt(); | 807 const SkLight::LightType type = (SkLight::LightType)buffer.readInt(); |
| 807 switch (type) { | 808 switch (type) { |
| 808 // Each of these constructors must first call SkLight's, so we'll read t
he baseclass | 809 // Each of these constructors must first call SkLight's, so we'll read t
he baseclass |
| 809 // then subclass, same order as flattenLight. | 810 // then subclass, same order as flattenLight. |
| 810 case SkLight::kDistant_LightType: return SkNEW_ARGS(SkDistantLight, (buf
fer)); | 811 case SkLight::kDistant_LightType: return SkNEW_ARGS(SkDistantLight, (buf
fer)); |
| 811 case SkLight::kPoint_LightType: return SkNEW_ARGS(SkPointLight, (buffe
r)); | 812 case SkLight::kPoint_LightType: return SkNEW_ARGS(SkPointLight, (buffe
r)); |
| 812 case SkLight::kSpot_LightType: return SkNEW_ARGS(SkSpotLight, (buffer
)); | 813 case SkLight::kSpot_LightType: return SkNEW_ARGS(SkSpotLight, (buffer
)); |
| 813 default: | 814 default: |
| 814 SkDEBUGFAIL("Unknown LightType."); | 815 SkDEBUGFAIL("Unknown LightType."); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 878 SkScalar ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropR
ect) { | 879 SkScalar ks, SkScalar shininess, SkImageFilter* input, const CropRect* cropR
ect) { |
| 879 return SkNEW_ARGS(SkSpecularLightingImageFilter, | 880 return SkNEW_ARGS(SkSpecularLightingImageFilter, |
| 880 (SkNEW_ARGS(SkSpotLight, (location, target, specularExponent, cutoffAngl
e, lightColor)), | 881 (SkNEW_ARGS(SkSpotLight, (location, target, specularExponent, cutoffAngl
e, lightColor)), |
| 881 surfaceScale, ks, shininess, input, cropRect)); | 882 surfaceScale, ks, shininess, input, cropRect)); |
| 882 } | 883 } |
| 883 | 884 |
| 884 SkLightingImageFilter::~SkLightingImageFilter() { | 885 SkLightingImageFilter::~SkLightingImageFilter() { |
| 885 SkSafeUnref(fLight); | 886 SkSafeUnref(fLight); |
| 886 } | 887 } |
| 887 | 888 |
| 888 SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) | 889 SkLightingImageFilter::SkLightingImageFilter(SkReadBuffer& buffer) |
| 889 : INHERITED(1, buffer) { | 890 : INHERITED(1, buffer) { |
| 890 fLight = SkLight::UnflattenLight(buffer); | 891 fLight = SkLight::UnflattenLight(buffer); |
| 891 fSurfaceScale = buffer.readScalar(); | 892 fSurfaceScale = buffer.readScalar(); |
| 892 buffer.validate(SkScalarIsFinite(fSurfaceScale)); | 893 buffer.validate(SkScalarIsFinite(fSurfaceScale)); |
| 893 } | 894 } |
| 894 | 895 |
| 895 void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { | 896 void SkLightingImageFilter::flatten(SkWriteBuffer& buffer) const { |
| 896 this->INHERITED::flatten(buffer); | 897 this->INHERITED::flatten(buffer); |
| 897 fLight->flattenLight(buffer); | 898 fLight->flattenLight(buffer); |
| 898 buffer.writeScalar(fSurfaceScale); | 899 buffer.writeScalar(fSurfaceScale); |
| 899 } | 900 } |
| 900 | 901 |
| 901 /////////////////////////////////////////////////////////////////////////////// | 902 /////////////////////////////////////////////////////////////////////////////// |
| 902 | 903 |
| 903 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca
lar surfaceScale, SkScalar kd, SkImageFilter* input, const CropRect* cropRect =
NULL) | 904 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca
lar surfaceScale, SkScalar kd, SkImageFilter* input, const CropRect* cropRect =
NULL) |
| 904 : SkLightingImageFilter(light, surfaceScale, input, cropRect), | 905 : SkLightingImageFilter(light, surfaceScale, input, cropRect), |
| 905 // According to the spec, kd can be any non-negative number : | 906 // According to the spec, kd can be any non-negative number : |
| 906 // http://www.w3.org/TR/SVG/filters.html#feDiffuseLightingElement | 907 // http://www.w3.org/TR/SVG/filters.html#feDiffuseLightingElement |
| 907 fKD(kd < 0 ? 0 : kd) | 908 fKD(kd < 0 ? 0 : kd) |
| 908 { | 909 { |
| 909 } | 910 } |
| 910 | 911 |
| 911 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkFlattenableReadBuff
er& buffer) | 912 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkReadBuffer& buffer) |
| 912 : INHERITED(buffer) | 913 : INHERITED(buffer) |
| 913 { | 914 { |
| 914 fKD = buffer.readScalar(); | 915 fKD = buffer.readScalar(); |
| 915 buffer.validate(SkScalarIsFinite(fKD) && (fKD >= 0)); | 916 buffer.validate(SkScalarIsFinite(fKD) && (fKD >= 0)); |
| 916 } | 917 } |
| 917 | 918 |
| 918 void SkDiffuseLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) con
st { | 919 void SkDiffuseLightingImageFilter::flatten(SkWriteBuffer& buffer) const { |
| 919 this->INHERITED::flatten(buffer); | 920 this->INHERITED::flatten(buffer); |
| 920 buffer.writeScalar(fKD); | 921 buffer.writeScalar(fKD); |
| 921 } | 922 } |
| 922 | 923 |
| 923 bool SkDiffuseLightingImageFilter::onFilterImage(Proxy* proxy, | 924 bool SkDiffuseLightingImageFilter::onFilterImage(Proxy* proxy, |
| 924 const SkBitmap& source, | 925 const SkBitmap& source, |
| 925 const SkMatrix& ctm, | 926 const SkMatrix& ctm, |
| 926 SkBitmap* dst, | 927 SkBitmap* dst, |
| 927 SkIPoint* offset) { | 928 SkIPoint* offset) { |
| 928 SkImageFilter* input = getInput(0); | 929 SkImageFilter* input = getInput(0); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 991 | 992 |
| 992 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkLight* light, SkS
calar surfaceScale, SkScalar ks, SkScalar shininess, SkImageFilter* input, const
CropRect* cropRect) | 993 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkLight* light, SkS
calar surfaceScale, SkScalar ks, SkScalar shininess, SkImageFilter* input, const
CropRect* cropRect) |
| 993 : SkLightingImageFilter(light, surfaceScale, input, cropRect), | 994 : SkLightingImageFilter(light, surfaceScale, input, cropRect), |
| 994 // According to the spec, ks can be any non-negative number : | 995 // According to the spec, ks can be any non-negative number : |
| 995 // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingElement | 996 // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingElement |
| 996 fKS(ks < 0 ? 0 : ks), | 997 fKS(ks < 0 ? 0 : ks), |
| 997 fShininess(shininess) | 998 fShininess(shininess) |
| 998 { | 999 { |
| 999 } | 1000 } |
| 1000 | 1001 |
| 1001 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkFlattenableReadBu
ffer& buffer) | 1002 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkReadBuffer& buffe
r) |
| 1002 : INHERITED(buffer) | 1003 : INHERITED(buffer) |
| 1003 { | 1004 { |
| 1004 fKS = buffer.readScalar(); | 1005 fKS = buffer.readScalar(); |
| 1005 fShininess = buffer.readScalar(); | 1006 fShininess = buffer.readScalar(); |
| 1006 buffer.validate(SkScalarIsFinite(fKS) && (fKS >= 0) && | 1007 buffer.validate(SkScalarIsFinite(fKS) && (fKS >= 0) && |
| 1007 SkScalarIsFinite(fShininess)); | 1008 SkScalarIsFinite(fShininess)); |
| 1008 } | 1009 } |
| 1009 | 1010 |
| 1010 void SkSpecularLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) co
nst { | 1011 void SkSpecularLightingImageFilter::flatten(SkWriteBuffer& buffer) const { |
| 1011 this->INHERITED::flatten(buffer); | 1012 this->INHERITED::flatten(buffer); |
| 1012 buffer.writeScalar(fKS); | 1013 buffer.writeScalar(fKS); |
| 1013 buffer.writeScalar(fShininess); | 1014 buffer.writeScalar(fShininess); |
| 1014 } | 1015 } |
| 1015 | 1016 |
| 1016 bool SkSpecularLightingImageFilter::onFilterImage(Proxy* proxy, | 1017 bool SkSpecularLightingImageFilter::onFilterImage(Proxy* proxy, |
| 1017 const SkBitmap& source, | 1018 const SkBitmap& source, |
| 1018 const SkMatrix& ctm, | 1019 const SkMatrix& ctm, |
| 1019 SkBitmap* dst, | 1020 SkBitmap* dst, |
| 1020 SkIPoint* offset) { | 1021 SkIPoint* offset) { |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1607 | 1608 |
| 1608 builder->fsCodeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 1609 builder->fsCodeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
| 1609 } | 1610 } |
| 1610 | 1611 |
| 1611 #endif | 1612 #endif |
| 1612 | 1613 |
| 1613 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 1614 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
| 1614 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 1615 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
| 1615 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 1616 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
| 1616 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1617 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |