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