1f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org/*
2f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org * Copyright 2012 The Android Open Source Project
3f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org *
4f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
5f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org * found in the LICENSE file.
6f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org */
7f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
8f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org#ifndef SkLightingImageFilter_DEFINED
9f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org#define SkLightingImageFilter_DEFINED
10f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
11377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.org#include "SkImageFilter.h"
12f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org#include "SkColor.h"
13f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
14f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgclass SK_API SkPoint3 {
15f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgpublic:
16f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    SkPoint3() {}
17f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    SkPoint3(SkScalar x, SkScalar y, SkScalar z)
18f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org      : fX(x), fY(y), fZ(z) {}
19f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    SkScalar dot(const SkPoint3& other) const {
201a5e51f94ed8cb01600184119e52bb64bdb3dcccreed@google.com        return fX * other.fX + fY * other.fY + fZ * other.fZ;
21f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
22f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    SkScalar maxComponent() const {
23f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        return fX > fY ? (fX > fZ ? fX : fZ) : (fY > fZ ? fY : fZ);
24f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
25f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    void normalize() {
264b681bc95b14e081f1cc5b68cb755d57fc8eb977commit-bot@chromium.org        // Small epsilon is added to prevent division by 0.
274b681bc95b14e081f1cc5b68cb755d57fc8eb977commit-bot@chromium.org        SkScalar scale = SkScalarInvert(SkScalarSqrt(dot(*this)) + SK_ScalarNearlyZero);
281a5e51f94ed8cb01600184119e52bb64bdb3dcccreed@google.com        fX = fX * scale;
291a5e51f94ed8cb01600184119e52bb64bdb3dcccreed@google.com        fY = fY * scale;
301a5e51f94ed8cb01600184119e52bb64bdb3dcccreed@google.com        fZ = fZ * scale;
31f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
32f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    SkPoint3 operator*(SkScalar scalar) const {
331a5e51f94ed8cb01600184119e52bb64bdb3dcccreed@google.com        return SkPoint3(fX * scalar, fY * scalar, fZ * scalar);
34f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
35f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    SkPoint3 operator-(const SkPoint3& other) const {
36f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        return SkPoint3(fX - other.fX, fY - other.fY, fZ - other.fZ);
37f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    }
38894790d77c56cd4bae8070331d275c6d2897e33csenorblanco@chromium.org    bool operator==(const SkPoint3& other) const {
39894790d77c56cd4bae8070331d275c6d2897e33csenorblanco@chromium.org        return fX == other.fX && fY == other.fY && fZ == other.fZ;
40894790d77c56cd4bae8070331d275c6d2897e33csenorblanco@chromium.org    }
41f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    SkScalar fX, fY, fZ;
42f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org};
43f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
44f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgclass SkLight;
45f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
46377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.orgclass SK_API SkLightingImageFilter : public SkImageFilter {
47f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgpublic:
48f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    static SkImageFilter* CreateDistantLitDiffuse(const SkPoint3& direction,
49254eae2b04a7f810de0ed92803a8bdd18d11babfsenorblanco@chromium.org        SkColor lightColor, SkScalar surfaceScale, SkScalar kd,
50b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org        SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
51bdb1ec453a36b3e8e8800713aef0dce934e6a6a7senorblanco@chromium.org    static SkImageFilter* CreatePointLitDiffuse(const SkPoint3& location,
52254eae2b04a7f810de0ed92803a8bdd18d11babfsenorblanco@chromium.org        SkColor lightColor, SkScalar surfaceScale, SkScalar kd,
53b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org        SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
54f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    static SkImageFilter* CreateSpotLitDiffuse(const SkPoint3& location,
55f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle,
56254eae2b04a7f810de0ed92803a8bdd18d11babfsenorblanco@chromium.org        SkColor lightColor, SkScalar surfaceScale, SkScalar kd,
57b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org        SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
58f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    static SkImageFilter* CreateDistantLitSpecular(const SkPoint3& direction,
59bdb1ec453a36b3e8e8800713aef0dce934e6a6a7senorblanco@chromium.org        SkColor lightColor, SkScalar surfaceScale, SkScalar ks,
60b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org        SkScalar shininess, SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
61bdb1ec453a36b3e8e8800713aef0dce934e6a6a7senorblanco@chromium.org    static SkImageFilter* CreatePointLitSpecular(const SkPoint3& location,
62bdb1ec453a36b3e8e8800713aef0dce934e6a6a7senorblanco@chromium.org        SkColor lightColor, SkScalar surfaceScale, SkScalar ks,
63b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org        SkScalar shininess, SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
64f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    static SkImageFilter* CreateSpotLitSpecular(const SkPoint3& location,
65f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org        const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle,
66bdb1ec453a36b3e8e8800713aef0dce934e6a6a7senorblanco@chromium.org        SkColor lightColor, SkScalar surfaceScale, SkScalar ks,
67b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org        SkScalar shininess, SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
68f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    ~SkLightingImageFilter();
69f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
700833777df1f05adafd9b70c666a72d80defa4f6bdjsollen@google.com    SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
71f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
72f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgprotected:
734e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    SkLightingImageFilter(SkLight* light,
744e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org                          SkScalar surfaceScale,
754e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org                          SkImageFilter* input,
765e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                          const CropRect* cropRect,
775e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                          uint32_t uniqueID);
789fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
798b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    explicit SkLightingImageFilter(SkReadBuffer& buffer);
809fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif
818b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
829fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed    const SkLight* light() const { return fLight.get(); }
83f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    SkScalar surfaceScale() const { return fSurfaceScale; }
84f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
85f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.orgprivate:
86377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.org    typedef SkImageFilter INHERITED;
879fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed    SkAutoTUnref<SkLight> fLight;
88f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org    SkScalar fSurfaceScale;
89f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org};
90f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org
91f49b429ceface4f75f5f96570ea5a8b94896529dsenorblanco@chromium.org#endif
92