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