SkLightingImageFilter.h revision 0833777df1f05adafd9b70c666a72d80defa4f6b
1/*
2 * Copyright 2012 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8
9#ifndef SkLightingImageFilter_DEFINED
10#define SkLightingImageFilter_DEFINED
11
12#include "SkImageFilter.h"
13#include "SkColor.h"
14
15class SK_API SkPoint3 {
16public:
17    SkPoint3() {}
18    SkPoint3(SkScalar x, SkScalar y, SkScalar z)
19      : fX(x), fY(y), fZ(z) {}
20    SkScalar dot(const SkPoint3& other) const {
21        return SkScalarMul(fX, other.fX)
22             + SkScalarMul(fY, other.fY)
23             + SkScalarMul(fZ, other.fZ);
24    }
25    SkScalar maxComponent() const {
26        return fX > fY ? (fX > fZ ? fX : fZ) : (fY > fZ ? fY : fZ);
27    }
28    void normalize() {
29        SkScalar scale = SkScalarInvert(SkScalarSqrt(dot(*this)));
30        fX = SkScalarMul(fX, scale);
31        fY = SkScalarMul(fY, scale);
32        fZ = SkScalarMul(fZ, scale);
33    }
34    SkPoint3 operator*(SkScalar scalar) const {
35        return SkPoint3(SkScalarMul(fX, scalar),
36                        SkScalarMul(fY, scalar),
37                        SkScalarMul(fZ, scalar));
38    }
39    SkPoint3 operator-(const SkPoint3& other) const {
40        return SkPoint3(fX - other.fX, fY - other.fY, fZ - other.fZ);
41    }
42    SkScalar fX, fY, fZ;
43};
44
45class SkLight;
46
47class SK_API SkLightingImageFilter : public SkImageFilter {
48public:
49    static SkImageFilter* CreateDistantLitDiffuse(const SkPoint3& direction,
50        const SkColor& lightColor, SkScalar surfaceScale, SkScalar kd);
51    static SkImageFilter* CreatePointLitDiffuse(SkPoint3& location,
52        const SkColor& lightColor, SkScalar surfaceScale, SkScalar kd);
53    static SkImageFilter* CreateSpotLitDiffuse(const SkPoint3& location,
54        const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle,
55        const SkColor& lightColor, SkScalar surfaceScale, SkScalar kd);
56    static SkImageFilter* CreateDistantLitSpecular(const SkPoint3& direction,
57        const SkColor& lightColor, SkScalar surfaceScale, SkScalar ks,
58        SkScalar shininess);
59    static SkImageFilter* CreatePointLitSpecular(SkPoint3& location,
60        const SkColor& lightColor, SkScalar surfaceScale, SkScalar ks,
61        SkScalar shininess);
62    static SkImageFilter* CreateSpotLitSpecular(const SkPoint3& location,
63        const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle,
64        const SkColor& lightColor, SkScalar surfaceScale, SkScalar ks,
65        SkScalar shininess);
66    ~SkLightingImageFilter();
67
68    SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
69
70protected:
71    SkLightingImageFilter(SkLight* light, const SkColor& lightColor,
72                          SkScalar surfaceScale);
73    explicit SkLightingImageFilter(SkFlattenableReadBuffer& buffer);
74    virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
75    const SkLight* light() const { return fLight; }
76    const SkPoint3& lightColor() const { return fLightColor; }
77    SkScalar surfaceScale() const { return fSurfaceScale; }
78
79private:
80    typedef SkImageFilter INHERITED;
81    SkLight* fLight;
82    SkPoint3 fLightColor;
83    SkScalar fSurfaceScale;
84};
85
86#endif
87
88