blob: 5fb0822666c19209ba230dcbf4582eefce8d5448 [file] [log] [blame]
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +00001/*
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
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +00008#ifndef SkLightingImageFilter_DEFINED
9#define SkLightingImageFilter_DEFINED
10
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000011#include "SkImageFilter.h"
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000012#include "SkColor.h"
13
14class SK_API SkPoint3 {
15public:
16 SkPoint3() {}
17 SkPoint3(SkScalar x, SkScalar y, SkScalar z)
18 : fX(x), fY(y), fZ(z) {}
19 SkScalar dot(const SkPoint3& other) const {
reed@google.com1a5e51f2014-01-27 13:41:02 +000020 return fX * other.fX + fY * other.fY + fZ * other.fZ;
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000021 }
22 SkScalar maxComponent() const {
23 return fX > fY ? (fX > fZ ? fX : fZ) : (fY > fZ ? fY : fZ);
24 }
25 void normalize() {
commit-bot@chromium.org4b681bc2013-09-13 12:40:02 +000026 // Small epsilon is added to prevent division by 0.
27 SkScalar scale = SkScalarInvert(SkScalarSqrt(dot(*this)) + SK_ScalarNearlyZero);
reed@google.com1a5e51f2014-01-27 13:41:02 +000028 fX = fX * scale;
29 fY = fY * scale;
30 fZ = fZ * scale;
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000031 }
32 SkPoint3 operator*(SkScalar scalar) const {
reed@google.com1a5e51f2014-01-27 13:41:02 +000033 return SkPoint3(fX * scalar, fY * scalar, fZ * scalar);
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000034 }
35 SkPoint3 operator-(const SkPoint3& other) const {
36 return SkPoint3(fX - other.fX, fY - other.fY, fZ - other.fZ);
37 }
senorblanco@chromium.org894790d2012-07-11 16:01:22 +000038 bool operator==(const SkPoint3& other) const {
39 return fX == other.fX && fY == other.fY && fZ == other.fZ;
40 }
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000041 SkScalar fX, fY, fZ;
42};
43
44class SkLight;
45
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000046class SK_API SkLightingImageFilter : public SkImageFilter {
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000047public:
48 static SkImageFilter* CreateDistantLitDiffuse(const SkPoint3& direction,
senorblanco@chromium.org254eae22012-10-05 17:38:00 +000049 SkColor lightColor, SkScalar surfaceScale, SkScalar kd,
senorblanco@chromium.orgb295fb62013-10-10 13:51:19 +000050 SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
senorblanco@chromium.orgbdb1ec42012-07-09 14:29:51 +000051 static SkImageFilter* CreatePointLitDiffuse(const SkPoint3& location,
senorblanco@chromium.org254eae22012-10-05 17:38:00 +000052 SkColor lightColor, SkScalar surfaceScale, SkScalar kd,
senorblanco@chromium.orgb295fb62013-10-10 13:51:19 +000053 SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000054 static SkImageFilter* CreateSpotLitDiffuse(const SkPoint3& location,
55 const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle,
senorblanco@chromium.org254eae22012-10-05 17:38:00 +000056 SkColor lightColor, SkScalar surfaceScale, SkScalar kd,
senorblanco@chromium.orgb295fb62013-10-10 13:51:19 +000057 SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000058 static SkImageFilter* CreateDistantLitSpecular(const SkPoint3& direction,
senorblanco@chromium.orgbdb1ec42012-07-09 14:29:51 +000059 SkColor lightColor, SkScalar surfaceScale, SkScalar ks,
senorblanco@chromium.orgb295fb62013-10-10 13:51:19 +000060 SkScalar shininess, SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
senorblanco@chromium.orgbdb1ec42012-07-09 14:29:51 +000061 static SkImageFilter* CreatePointLitSpecular(const SkPoint3& location,
62 SkColor lightColor, SkScalar surfaceScale, SkScalar ks,
senorblanco@chromium.orgb295fb62013-10-10 13:51:19 +000063 SkScalar shininess, SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000064 static SkImageFilter* CreateSpotLitSpecular(const SkPoint3& location,
65 const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle,
senorblanco@chromium.orgbdb1ec42012-07-09 14:29:51 +000066 SkColor lightColor, SkScalar surfaceScale, SkScalar ks,
senorblanco@chromium.orgb295fb62013-10-10 13:51:19 +000067 SkScalar shininess, SkImageFilter* input = NULL, const CropRect* cropRect = NULL);
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000068 ~SkLightingImageFilter();
69
djsollen@google.com08337772012-06-26 14:33:13 +000070 SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000071
72protected:
senorblanco@chromium.org4e16bb22013-07-26 00:10:07 +000073 SkLightingImageFilter(SkLight* light,
74 SkScalar surfaceScale,
75 SkImageFilter* input,
senorblanco5e5f9482014-08-26 12:27:12 -070076 const CropRect* cropRect,
77 uint32_t uniqueID);
reed9fa60da2014-08-21 07:59:51 -070078#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000079 explicit SkLightingImageFilter(SkReadBuffer& buffer);
reed9fa60da2014-08-21 07:59:51 -070080#endif
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000081 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
reed9fa60da2014-08-21 07:59:51 -070082 const SkLight* light() const { return fLight.get(); }
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000083 SkScalar surfaceScale() const { return fSurfaceScale; }
84
85private:
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000086 typedef SkImageFilter INHERITED;
reed9fa60da2014-08-21 07:59:51 -070087 SkAutoTUnref<SkLight> fLight;
senorblanco@chromium.orgf49b4292012-06-22 21:01:23 +000088 SkScalar fSurfaceScale;
89};
90
91#endif