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 |