180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 The Android Open Source Project 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkLightingImageFilter_DEFINED 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkLightingImageFilter_DEFINED 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkImageFilter.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkColor.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SK_API SkPoint3 { 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint3() {} 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint3(SkScalar x, SkScalar y, SkScalar z) 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru : fX(x), fY(y), fZ(z) {} 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar dot(const SkPoint3& other) const { 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkScalarMul(fX, other.fX) 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru + SkScalarMul(fY, other.fY) 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru + SkScalarMul(fZ, other.fZ); 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar maxComponent() const { 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fX > fY ? (fX > fZ ? fX : fZ) : (fY > fZ ? fY : fZ); 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void normalize() { 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar scale = SkScalarInvert(SkScalarSqrt(dot(*this))); 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fX = SkScalarMul(fX, scale); 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fY = SkScalarMul(fY, scale); 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fZ = SkScalarMul(fZ, scale); 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint3 operator*(SkScalar scalar) const { 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkPoint3(SkScalarMul(fX, scalar), 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalarMul(fY, scalar), 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalarMul(fZ, scalar)); 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint3 operator-(const SkPoint3& other) const { 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkPoint3(fX - other.fX, fY - other.fY, fZ - other.fZ); 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool operator==(const SkPoint3& other) const { 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fX == other.fX && fY == other.fY && fZ == other.fZ; 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar fX, fY, fZ; 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkLight; 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 50096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerclass SK_API SkLightingImageFilter : public SkImageFilter { 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkImageFilter* CreateDistantLitDiffuse(const SkPoint3& direction, 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColor lightColor, SkScalar surfaceScale, SkScalar kd, 54e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger SkImageFilter* input = NULL, const SkIRect* cropRect = NULL); 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkImageFilter* CreatePointLitDiffuse(const SkPoint3& location, 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColor lightColor, SkScalar surfaceScale, SkScalar kd, 57e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger SkImageFilter* input = NULL, const SkIRect* cropRect = NULL); 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkImageFilter* CreateSpotLitDiffuse(const SkPoint3& location, 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle, 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColor lightColor, SkScalar surfaceScale, SkScalar kd, 61e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger SkImageFilter* input = NULL, const SkIRect* cropRect = NULL); 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkImageFilter* CreateDistantLitSpecular(const SkPoint3& direction, 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColor lightColor, SkScalar surfaceScale, SkScalar ks, 64e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger SkScalar shininess, SkImageFilter* input = NULL, const SkIRect* cropRect = NULL); 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkImageFilter* CreatePointLitSpecular(const SkPoint3& location, 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColor lightColor, SkScalar surfaceScale, SkScalar ks, 67e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger SkScalar shininess, SkImageFilter* input = NULL, const SkIRect* cropRect = NULL); 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkImageFilter* CreateSpotLitSpecular(const SkPoint3& location, 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle, 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColor lightColor, SkScalar surfaceScale, SkScalar ks, 71e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger SkScalar shininess, SkImageFilter* input = NULL, const SkIRect* cropRect = NULL); 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ~SkLightingImageFilter(); 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 77e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger SkLightingImageFilter(SkLight* light, 78e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger SkScalar surfaceScale, 79e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger SkImageFilter* input, 80e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger const SkIRect* cropRect = NULL); 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru explicit SkLightingImageFilter(SkFlattenableReadBuffer& buffer); 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkLight* light() const { return fLight; } 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar surfaceScale() const { return fSurfaceScale; } 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 87096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger typedef SkImageFilter INHERITED; 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkLight* fLight; 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar fSurfaceScale; 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 93