Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / include / effects / SkLightingImageFilter.h
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 #ifndef SkLightingImageFilter_DEFINED
9 #define SkLightingImageFilter_DEFINED
10
11 #include "SkImageFilter.h"
12 #include "SkColor.h"
13
14 class SK_API SkPoint3 {
15 public:
16     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;
21     }
22     SkScalar maxComponent() const {
23         return fX > fY ? (fX > fZ ? fX : fZ) : (fY > fZ ? fY : fZ);
24     }
25     void normalize() {
26         // Small epsilon is added to prevent division by 0.
27         SkScalar scale = SkScalarInvert(SkScalarSqrt(dot(*this)) + SK_ScalarNearlyZero);
28         fX = fX * scale;
29         fY = fY * scale;
30         fZ = fZ * scale;
31     }
32     SkPoint3 operator*(SkScalar scalar) const {
33         return SkPoint3(fX * scalar, fY * scalar, fZ * scalar);
34     }
35     SkPoint3 operator-(const SkPoint3& other) const {
36         return SkPoint3(fX - other.fX, fY - other.fY, fZ - other.fZ);
37     }
38     bool operator==(const SkPoint3& other) const {
39         return fX == other.fX && fY == other.fY && fZ == other.fZ;
40     }
41     SkScalar fX, fY, fZ;
42 };
43
44 class SkLight;
45
46 class SK_API SkLightingImageFilter : public SkImageFilter {
47 public:
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();
69
70     SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
71
72 protected:
73     SkLightingImageFilter(SkLight* light,
74                           SkScalar surfaceScale,
75                           SkImageFilter* input,
76                           const CropRect* cropRect,
77                           uint32_t uniqueID);
78 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
79     explicit SkLightingImageFilter(SkReadBuffer& buffer);
80 #endif
81     virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
82     const SkLight* light() const { return fLight.get(); }
83     SkScalar surfaceScale() const { return fSurfaceScale; }
84
85 private:
86     typedef SkImageFilter INHERITED;
87     SkAutoTUnref<SkLight> fLight;
88     SkScalar fSurfaceScale;
89 };
90
91 #endif