Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/effects/SkLightingImageFilter.cpp

Issue 26594008: Remove need for readFlattenableT from SkLightingImageFilter. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: unflatten/Unflatten Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 489 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 #else 500 #else
501 501
502 class GrGLLight; 502 class GrGLLight;
503 503
504 #endif 504 #endif
505 505
506 }; 506 };
507 507
508 /////////////////////////////////////////////////////////////////////////////// 508 ///////////////////////////////////////////////////////////////////////////////
509 509
510 class SkLight : public SkFlattenable { 510 class SkLight : public SkRefCnt {
511 public: 511 public:
512 SK_DECLARE_INST_COUNT(SkLight) 512 SK_DECLARE_INST_COUNT(SkLight)
513 513
514 enum LightType { 514 enum LightType {
515 kDistant_LightType, 515 kDistant_LightType,
516 kPoint_LightType, 516 kPoint_LightType,
517 kSpot_LightType, 517 kSpot_LightType,
518 }; 518 };
519 virtual LightType type() const = 0; 519 virtual LightType type() const = 0;
520 const SkPoint3& color() const { return fColor; } 520 const SkPoint3& color() const { return fColor; }
521 virtual GrGLLight* createGLLight() const = 0; 521 virtual GrGLLight* createGLLight() const = 0;
522 virtual bool isEqual(const SkLight& other) const { 522 virtual bool isEqual(const SkLight& other) const {
523 return fColor == other.fColor; 523 return fColor == other.fColor;
524 } 524 }
525 // Called to know whether the generated GrGLLight will require access to the fragment position. 525 // Called to know whether the generated GrGLLight will require access to the fragment position.
526 virtual bool requiresFragmentPosition() const = 0; 526 virtual bool requiresFragmentPosition() const = 0;
527 virtual SkLight* transform(const SkMatrix& matrix) const = 0; 527 virtual SkLight* transform(const SkMatrix& matrix) const = 0;
528 528
529 // Defined below SkLight's subclasses.
530 void flattenLight(SkFlattenableWriteBuffer& buffer) const;
531 static SkLight* UnflattenLight(SkFlattenableReadBuffer& buffer);
532
529 protected: 533 protected:
530 SkLight(SkColor color) 534 SkLight(SkColor color)
531 : fColor(SkIntToScalar(SkColorGetR(color)), 535 : fColor(SkIntToScalar(SkColorGetR(color)),
532 SkIntToScalar(SkColorGetG(color)), 536 SkIntToScalar(SkColorGetG(color)),
533 SkIntToScalar(SkColorGetB(color))) {} 537 SkIntToScalar(SkColorGetB(color))) {}
534 SkLight(const SkPoint3& color) 538 SkLight(const SkPoint3& color)
535 : fColor(color) {} 539 : fColor(color) {}
536 SkLight(SkFlattenableReadBuffer& buffer) 540 SkLight(SkFlattenableReadBuffer& buffer) {
537 : INHERITED(buffer) {
538 fColor = readPoint3(buffer); 541 fColor = readPoint3(buffer);
539 } 542 }
540 virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { 543
541 INHERITED::flatten(buffer); 544 virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const = 0;
542 writePoint3(fColor, buffer); 545
543 }
544 546
545 private: 547 private:
546 typedef SkFlattenable INHERITED; 548 typedef SkRefCnt INHERITED;
547 SkPoint3 fColor; 549 SkPoint3 fColor;
548 }; 550 };
549 551
550 SK_DEFINE_INST_COUNT(SkLight) 552 SK_DEFINE_INST_COUNT(SkLight)
551 553
552 /////////////////////////////////////////////////////////////////////////////// 554 ///////////////////////////////////////////////////////////////////////////////
553 555
554 class SkDistantLight : public SkLight { 556 class SkDistantLight : public SkLight {
555 public: 557 public:
556 SkDistantLight(const SkPoint3& direction, SkColor color) 558 SkDistantLight(const SkPoint3& direction, SkColor color)
(...skipping 19 matching lines...) Expand all
576 virtual bool isEqual(const SkLight& other) const SK_OVERRIDE { 578 virtual bool isEqual(const SkLight& other) const SK_OVERRIDE {
577 if (other.type() != kDistant_LightType) { 579 if (other.type() != kDistant_LightType) {
578 return false; 580 return false;
579 } 581 }
580 582
581 const SkDistantLight& o = static_cast<const SkDistantLight&>(other); 583 const SkDistantLight& o = static_cast<const SkDistantLight&>(other);
582 return INHERITED::isEqual(other) && 584 return INHERITED::isEqual(other) &&
583 fDirection == o.fDirection; 585 fDirection == o.fDirection;
584 } 586 }
585 587
586 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDistantLight) 588 SkDistantLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
589 fDirection = readPoint3(buffer);
590 }
587 591
588 protected: 592 protected:
589 SkDistantLight(const SkPoint3& direction, const SkPoint3& color) 593 SkDistantLight(const SkPoint3& direction, const SkPoint3& color)
590 : INHERITED(color), fDirection(direction) { 594 : INHERITED(color), fDirection(direction) {
591 } 595 }
592 SkDistantLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
593 fDirection = readPoint3(buffer);
594 }
595 virtual SkLight* transform(const SkMatrix& matrix) const { 596 virtual SkLight* transform(const SkMatrix& matrix) const {
596 return new SkDistantLight(direction(), color()); 597 return new SkDistantLight(direction(), color());
597 } 598 }
598 virtual void flatten(SkFlattenableWriteBuffer& buffer) const { 599 virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const SK_OVERR IDE {
599 INHERITED::flatten(buffer);
600 writePoint3(fDirection, buffer); 600 writePoint3(fDirection, buffer);
601 } 601 }
602 602
603 private: 603 private:
604 typedef SkLight INHERITED; 604 typedef SkLight INHERITED;
605 SkPoint3 fDirection; 605 SkPoint3 fDirection;
606 }; 606 };
607 607
608 /////////////////////////////////////////////////////////////////////////////// 608 ///////////////////////////////////////////////////////////////////////////////
609 609
(...skipping 29 matching lines...) Expand all
639 return INHERITED::isEqual(other) && 639 return INHERITED::isEqual(other) &&
640 fLocation == o.fLocation; 640 fLocation == o.fLocation;
641 } 641 }
642 virtual SkLight* transform(const SkMatrix& matrix) const { 642 virtual SkLight* transform(const SkMatrix& matrix) const {
643 SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY); 643 SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY);
644 matrix.mapPoints(&location2, 1); 644 matrix.mapPoints(&location2, 1);
645 SkPoint3 location(location2.fX, location2.fY, fLocation.fZ); 645 SkPoint3 location(location2.fX, location2.fY, fLocation.fZ);
646 return new SkPointLight(location, color()); 646 return new SkPointLight(location, color());
647 } 647 }
648 648
649 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPointLight)
650
651 protected:
652 SkPointLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { 649 SkPointLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
653 fLocation = readPoint3(buffer); 650 fLocation = readPoint3(buffer);
654 } 651 }
652
653 protected:
655 SkPointLight(const SkPoint3& location, const SkPoint3& color) 654 SkPointLight(const SkPoint3& location, const SkPoint3& color)
656 : INHERITED(color), fLocation(location) {} 655 : INHERITED(color), fLocation(location) {}
657 virtual void flatten(SkFlattenableWriteBuffer& buffer) const { 656 virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const SK_OVERR IDE {
658 INHERITED::flatten(buffer);
659 writePoint3(fLocation, buffer); 657 writePoint3(fLocation, buffer);
660 } 658 }
661 659
662 private: 660 private:
663 typedef SkLight INHERITED; 661 typedef SkLight INHERITED;
664 SkPoint3 fLocation; 662 SkPoint3 fLocation;
665 }; 663 };
666 664
667 /////////////////////////////////////////////////////////////////////////////// 665 ///////////////////////////////////////////////////////////////////////////////
668 666
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 virtual bool requiresFragmentPosition() const SK_OVERRIDE { return true; } 720 virtual bool requiresFragmentPosition() const SK_OVERRIDE { return true; }
723 virtual LightType type() const { return kSpot_LightType; } 721 virtual LightType type() const { return kSpot_LightType; }
724 const SkPoint3& location() const { return fLocation; } 722 const SkPoint3& location() const { return fLocation; }
725 const SkPoint3& target() const { return fTarget; } 723 const SkPoint3& target() const { return fTarget; }
726 SkScalar specularExponent() const { return fSpecularExponent; } 724 SkScalar specularExponent() const { return fSpecularExponent; }
727 SkScalar cosInnerConeAngle() const { return fCosInnerConeAngle; } 725 SkScalar cosInnerConeAngle() const { return fCosInnerConeAngle; }
728 SkScalar cosOuterConeAngle() const { return fCosOuterConeAngle; } 726 SkScalar cosOuterConeAngle() const { return fCosOuterConeAngle; }
729 SkScalar coneScale() const { return fConeScale; } 727 SkScalar coneScale() const { return fConeScale; }
730 const SkPoint3& s() const { return fS; } 728 const SkPoint3& s() const { return fS; }
731 729
732 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpotLight)
733
734 protected:
735 SkSpotLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { 730 SkSpotLight(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
736 fLocation = readPoint3(buffer); 731 fLocation = readPoint3(buffer);
737 fTarget = readPoint3(buffer); 732 fTarget = readPoint3(buffer);
738 fSpecularExponent = buffer.readScalar(); 733 fSpecularExponent = buffer.readScalar();
739 fCosOuterConeAngle = buffer.readScalar(); 734 fCosOuterConeAngle = buffer.readScalar();
740 fCosInnerConeAngle = buffer.readScalar(); 735 fCosInnerConeAngle = buffer.readScalar();
741 fConeScale = buffer.readScalar(); 736 fConeScale = buffer.readScalar();
742 fS = readPoint3(buffer); 737 fS = readPoint3(buffer);
743 } 738 }
739 protected:
744 SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu larExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar co neScale, const SkPoint3& s, const SkPoint3& color) 740 SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu larExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar co neScale, const SkPoint3& s, const SkPoint3& color)
745 : INHERITED(color), 741 : INHERITED(color),
746 fLocation(location), 742 fLocation(location),
747 fTarget(target), 743 fTarget(target),
748 fSpecularExponent(specularExponent), 744 fSpecularExponent(specularExponent),
749 fCosOuterConeAngle(cosOuterConeAngle), 745 fCosOuterConeAngle(cosOuterConeAngle),
750 fCosInnerConeAngle(cosInnerConeAngle), 746 fCosInnerConeAngle(cosInnerConeAngle),
751 fConeScale(coneScale), 747 fConeScale(coneScale),
752 fS(s) 748 fS(s)
753 { 749 {
754 } 750 }
755 virtual void flatten(SkFlattenableWriteBuffer& buffer) const { 751 virtual void onFlattenLight(SkFlattenableWriteBuffer& buffer) const SK_OVERR IDE {
756 INHERITED::flatten(buffer);
757 writePoint3(fLocation, buffer); 752 writePoint3(fLocation, buffer);
758 writePoint3(fTarget, buffer); 753 writePoint3(fTarget, buffer);
759 buffer.writeScalar(fSpecularExponent); 754 buffer.writeScalar(fSpecularExponent);
760 buffer.writeScalar(fCosOuterConeAngle); 755 buffer.writeScalar(fCosOuterConeAngle);
761 buffer.writeScalar(fCosInnerConeAngle); 756 buffer.writeScalar(fCosInnerConeAngle);
762 buffer.writeScalar(fConeScale); 757 buffer.writeScalar(fConeScale);
763 writePoint3(fS, buffer); 758 writePoint3(fS, buffer);
764 } 759 }
765 760
766 virtual bool isEqual(const SkLight& other) const SK_OVERRIDE { 761 virtual bool isEqual(const SkLight& other) const SK_OVERRIDE {
(...skipping 23 matching lines...) Expand all
790 SkPoint3 fS; 785 SkPoint3 fS;
791 }; 786 };
792 787
793 // According to the spec, the specular term should be in the range [1, 128] : 788 // According to the spec, the specular term should be in the range [1, 128] :
794 // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingSpecularExponentAttri bute 789 // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingSpecularExponentAttri bute
795 const SkScalar SkSpotLight::kSpecularExponentMin = SkFloatToScalar(1.0f); 790 const SkScalar SkSpotLight::kSpecularExponentMin = SkFloatToScalar(1.0f);
796 const SkScalar SkSpotLight::kSpecularExponentMax = SkFloatToScalar(128.0f); 791 const SkScalar SkSpotLight::kSpecularExponentMax = SkFloatToScalar(128.0f);
797 792
798 /////////////////////////////////////////////////////////////////////////////// 793 ///////////////////////////////////////////////////////////////////////////////
799 794
795 void SkLight::flattenLight(SkFlattenableWriteBuffer& buffer) const {
796 // Write type first, then baseclass, then subclass.
797 buffer.writeInt(this->type());
798 writePoint3(fColor, buffer);
799 this->onFlattenLight(buffer);
800 }
801
802 /*static*/ SkLight* SkLight::UnflattenLight(SkFlattenableReadBuffer& buffer) {
803 // Read type first.
804 const SkLight::LightType type = (SkLight::LightType)buffer.readInt();
805 switch (type) {
806 // Each of these constructors must first call SkLight's, so we'll read t he baseclass
807 // then subclass, same order as flattenLight.
808 case SkLight::kDistant_LightType: return SkNEW_ARGS(SkDistantLight, (buf fer));
809 case SkLight::kPoint_LightType: return SkNEW_ARGS(SkPointLight, (buffe r));
810 case SkLight::kSpot_LightType: return SkNEW_ARGS(SkSpotLight, (buffer ));
811 default:
812 SkDEBUGFAIL("Unknown LightType.");
813 return NULL;
814 }
815 }
816 ///////////////////////////////////////////////////////////////////////////////
817
800 SkLightingImageFilter::SkLightingImageFilter(SkLight* light, SkScalar surfaceSca le, SkImageFilter* input, const CropRect* cropRect) 818 SkLightingImageFilter::SkLightingImageFilter(SkLight* light, SkScalar surfaceSca le, SkImageFilter* input, const CropRect* cropRect)
801 : INHERITED(input, cropRect), 819 : INHERITED(input, cropRect),
802 fLight(light), 820 fLight(light),
803 fSurfaceScale(SkScalarDiv(surfaceScale, SkIntToScalar(255))) 821 fSurfaceScale(SkScalarDiv(surfaceScale, SkIntToScalar(255)))
804 { 822 {
805 SkASSERT(fLight); 823 SkASSERT(fLight);
806 // our caller knows that we take ownership of the light, so we don't 824 // our caller knows that we take ownership of the light, so we don't
807 // need to call ref() here. 825 // need to call ref() here.
808 } 826 }
809 827
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
858 return SkNEW_ARGS(SkSpecularLightingImageFilter, 876 return SkNEW_ARGS(SkSpecularLightingImageFilter,
859 (SkNEW_ARGS(SkSpotLight, (location, target, specularExponent, cutoffAngl e, lightColor)), 877 (SkNEW_ARGS(SkSpotLight, (location, target, specularExponent, cutoffAngl e, lightColor)),
860 surfaceScale, ks, shininess, input, cropRect)); 878 surfaceScale, ks, shininess, input, cropRect));
861 } 879 }
862 880
863 SkLightingImageFilter::~SkLightingImageFilter() { 881 SkLightingImageFilter::~SkLightingImageFilter() {
864 fLight->unref(); 882 fLight->unref();
865 } 883 }
866 884
867 SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer) 885 SkLightingImageFilter::SkLightingImageFilter(SkFlattenableReadBuffer& buffer)
868 : INHERITED(buffer) 886 : INHERITED(buffer) {
869 { 887 fLight = SkLight::UnflattenLight(buffer);
870 fLight = buffer.readFlattenableT<SkLight>();
871 fSurfaceScale = buffer.readScalar(); 888 fSurfaceScale = buffer.readScalar();
872 } 889 }
873 890
874 void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { 891 void SkLightingImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
875 this->INHERITED::flatten(buffer); 892 this->INHERITED::flatten(buffer);
876 buffer.writeFlattenable(fLight); 893 fLight->flattenLight(buffer);
877 buffer.writeScalar(fSurfaceScale); 894 buffer.writeScalar(fSurfaceScale);
878 } 895 }
879 896
880 /////////////////////////////////////////////////////////////////////////////// 897 ///////////////////////////////////////////////////////////////////////////////
881 898
882 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca lar surfaceScale, SkScalar kd, SkImageFilter* input, const CropRect* cropRect = NULL) 899 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca lar surfaceScale, SkScalar kd, SkImageFilter* input, const CropRect* cropRect = NULL)
883 : SkLightingImageFilter(light, surfaceScale, input, cropRect), 900 : SkLightingImageFilter(light, surfaceScale, input, cropRect),
884 fKD(kd) 901 fKD(kd)
885 { 902 {
886 } 903 }
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
1555 &fLightColorFunc); 1572 &fLightColorFunc);
1556 1573
1557 builder->fsCodeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); 1574 builder->fsCodeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight);
1558 } 1575 }
1559 1576
1560 #endif 1577 #endif
1561 1578
1562 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) 1579 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter)
1563 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) 1580 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter)
1564 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) 1581 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter)
1565 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight)
1566 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight)
1567 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight)
1568 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1582 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698