|  | /* | 
|  | * Copyright 2012 The Android Open Source Project | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #ifndef SkLightingImageFilter_DEFINED | 
|  | #define SkLightingImageFilter_DEFINED | 
|  |  | 
|  | #include "SkImageFilter.h" | 
|  | #include "SkColor.h" | 
|  |  | 
|  | class SK_API SkPoint3 { | 
|  | public: | 
|  | SkPoint3() {} | 
|  | SkPoint3(SkScalar x, SkScalar y, SkScalar z) | 
|  | : fX(x), fY(y), fZ(z) {} | 
|  | SkScalar dot(const SkPoint3& other) const { | 
|  | return fX * other.fX + fY * other.fY + fZ * other.fZ; | 
|  | } | 
|  | SkScalar maxComponent() const { | 
|  | return fX > fY ? (fX > fZ ? fX : fZ) : (fY > fZ ? fY : fZ); | 
|  | } | 
|  | void normalize() { | 
|  | // Small epsilon is added to prevent division by 0. | 
|  | SkScalar scale = SkScalarInvert(SkScalarSqrt(dot(*this)) + SK_ScalarNearlyZero); | 
|  | fX = fX * scale; | 
|  | fY = fY * scale; | 
|  | fZ = fZ * scale; | 
|  | } | 
|  | SkPoint3 operator*(SkScalar scalar) const { | 
|  | return SkPoint3(fX * scalar, fY * scalar, fZ * scalar); | 
|  | } | 
|  | SkPoint3 operator-(const SkPoint3& other) const { | 
|  | return SkPoint3(fX - other.fX, fY - other.fY, fZ - other.fZ); | 
|  | } | 
|  | bool operator==(const SkPoint3& other) const { | 
|  | return fX == other.fX && fY == other.fY && fZ == other.fZ; | 
|  | } | 
|  | SkScalar fX, fY, fZ; | 
|  | }; | 
|  |  | 
|  | class SkLight; | 
|  |  | 
|  | class SK_API SkLightingImageFilter : public SkImageFilter { | 
|  | public: | 
|  | static SkImageFilter* CreateDistantLitDiffuse(const SkPoint3& direction, | 
|  | SkColor lightColor, SkScalar surfaceScale, SkScalar kd, | 
|  | SkImageFilter* input = NULL, const CropRect* cropRect = NULL); | 
|  | static SkImageFilter* CreatePointLitDiffuse(const SkPoint3& location, | 
|  | SkColor lightColor, SkScalar surfaceScale, SkScalar kd, | 
|  | SkImageFilter* input = NULL, const CropRect* cropRect = NULL); | 
|  | static SkImageFilter* CreateSpotLitDiffuse(const SkPoint3& location, | 
|  | const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle, | 
|  | SkColor lightColor, SkScalar surfaceScale, SkScalar kd, | 
|  | SkImageFilter* input = NULL, const CropRect* cropRect = NULL); | 
|  | static SkImageFilter* CreateDistantLitSpecular(const SkPoint3& direction, | 
|  | SkColor lightColor, SkScalar surfaceScale, SkScalar ks, | 
|  | SkScalar shininess, SkImageFilter* input = NULL, const CropRect* cropRect = NULL); | 
|  | static SkImageFilter* CreatePointLitSpecular(const SkPoint3& location, | 
|  | SkColor lightColor, SkScalar surfaceScale, SkScalar ks, | 
|  | SkScalar shininess, SkImageFilter* input = NULL, const CropRect* cropRect = NULL); | 
|  | static SkImageFilter* CreateSpotLitSpecular(const SkPoint3& location, | 
|  | const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle, | 
|  | SkColor lightColor, SkScalar surfaceScale, SkScalar ks, | 
|  | SkScalar shininess, SkImageFilter* input = NULL, const CropRect* cropRect = NULL); | 
|  | ~SkLightingImageFilter(); | 
|  |  | 
|  | SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() | 
|  |  | 
|  | protected: | 
|  | SkLightingImageFilter(SkLight* light, | 
|  | SkScalar surfaceScale, | 
|  | SkImageFilter* input, | 
|  | const CropRect* cropRect, | 
|  | uint32_t uniqueID); | 
|  | #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING | 
|  | explicit SkLightingImageFilter(SkReadBuffer& buffer); | 
|  | #endif | 
|  | virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; | 
|  | const SkLight* light() const { return fLight.get(); } | 
|  | SkScalar surfaceScale() const { return fSurfaceScale; } | 
|  |  | 
|  | private: | 
|  | typedef SkImageFilter INHERITED; | 
|  | SkAutoTUnref<SkLight> fLight; | 
|  | SkScalar fSurfaceScale; | 
|  | }; | 
|  |  | 
|  | #endif |