2 * Copyright 2012 The Android Open Source Project
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #ifndef SkLightingImageFilter_DEFINED
9 #define SkLightingImageFilter_DEFINED
11 #include "SkImageFilter.h"
14 class SK_API SkPoint3 {
17 SkPoint3(SkScalar x, SkScalar y, SkScalar z)
18 : fX(x), fY(y), fZ(z) {}
19 SkScalar dot(const SkPoint3& other) const {
20 return fX * other.fX + fY * other.fY + fZ * other.fZ;
22 SkScalar maxComponent() const {
23 return fX > fY ? (fX > fZ ? fX : fZ) : (fY > fZ ? fY : fZ);
26 // Small epsilon is added to prevent division by 0.
27 SkScalar scale = SkScalarInvert(SkScalarSqrt(dot(*this)) + SK_ScalarNearlyZero);
32 SkPoint3 operator*(SkScalar scalar) const {
33 return SkPoint3(fX * scalar, fY * scalar, fZ * scalar);
35 SkPoint3 operator-(const SkPoint3& other) const {
36 return SkPoint3(fX - other.fX, fY - other.fY, fZ - other.fZ);
38 bool operator==(const SkPoint3& other) const {
39 return fX == other.fX && fY == other.fY && fZ == other.fZ;
46 class SK_API SkLightingImageFilter : public SkImageFilter {
48 static SkImageFilter* CreateDistantLitDiffuse(const SkPoint3& direction,
49 SkColor lightColor, SkScalar surfaceScale, SkScalar kd,
50 SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
51 static SkImageFilter* CreatePointLitDiffuse(const SkPoint3& location,
52 SkColor lightColor, SkScalar surfaceScale, SkScalar kd,
53 SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
54 static SkImageFilter* CreateSpotLitDiffuse(const SkPoint3& location,
55 const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle,
56 SkColor lightColor, SkScalar surfaceScale, SkScalar kd,
57 SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
58 static SkImageFilter* CreateDistantLitSpecular(const SkPoint3& direction,
59 SkColor lightColor, SkScalar surfaceScale, SkScalar ks,
60 SkScalar shininess, SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
61 static SkImageFilter* CreatePointLitSpecular(const SkPoint3& location,
62 SkColor lightColor, SkScalar surfaceScale, SkScalar ks,
63 SkScalar shininess, SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
64 static SkImageFilter* CreateSpotLitSpecular(const SkPoint3& location,
65 const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle,
66 SkColor lightColor, SkScalar surfaceScale, SkScalar ks,
67 SkScalar shininess, SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
68 ~SkLightingImageFilter();
70 SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
73 SkLightingImageFilter(SkLight* light,
74 SkScalar surfaceScale,
76 const CropRect* cropRect,
78 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
79 explicit SkLightingImageFilter(SkReadBuffer& buffer);
81 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
82 const SkLight* light() const { return fLight.get(); }
83 SkScalar surfaceScale() const { return fSurfaceScale; }
86 typedef SkImageFilter INHERITED;
87 SkAutoTUnref<SkLight> fLight;
88 SkScalar fSurfaceScale;