Home | History | Annotate | Download | only in effects
      1 /*
      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 
      8 #ifndef SkLightingImageFilter_DEFINED
      9 #define SkLightingImageFilter_DEFINED
     10 
     11 #include "SkImageFilter.h"
     12 #include "SkColor.h"
     13 
     14 
     15 class SkImageFilterLight;
     16 struct SkPoint3;
     17 
     18 class SK_API SkLightingImageFilter : public SkImageFilter {
     19 public:
     20     static sk_sp<SkImageFilter> MakeDistantLitDiffuse(const SkPoint3& direction,
     21         SkColor lightColor, SkScalar surfaceScale, SkScalar kd,
     22         sk_sp<SkImageFilter> input, const CropRect* cropRect = nullptr);
     23     static sk_sp<SkImageFilter> MakePointLitDiffuse(const SkPoint3& location,
     24         SkColor lightColor, SkScalar surfaceScale, SkScalar kd,
     25         sk_sp<SkImageFilter> input, const CropRect* cropRect = nullptr);
     26     static sk_sp<SkImageFilter> MakeSpotLitDiffuse(const SkPoint3& location,
     27         const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle,
     28         SkColor lightColor, SkScalar surfaceScale, SkScalar kd,
     29         sk_sp<SkImageFilter> input, const CropRect* cropRect = nullptr);
     30     static sk_sp<SkImageFilter> MakeDistantLitSpecular(const SkPoint3& direction,
     31         SkColor lightColor, SkScalar surfaceScale, SkScalar ks,
     32         SkScalar shininess, sk_sp<SkImageFilter> input, const CropRect* cropRect = nullptr);
     33     static sk_sp<SkImageFilter> MakePointLitSpecular(const SkPoint3& location,
     34         SkColor lightColor, SkScalar surfaceScale, SkScalar ks,
     35         SkScalar shininess, sk_sp<SkImageFilter> input, const CropRect* cropRect = nullptr);
     36     static sk_sp<SkImageFilter> MakeSpotLitSpecular(const SkPoint3& location,
     37         const SkPoint3& target, SkScalar specularExponent, SkScalar cutoffAngle,
     38         SkColor lightColor, SkScalar surfaceScale, SkScalar ks,
     39         SkScalar shininess, sk_sp<SkImageFilter> input, const CropRect* cropRect = nullptr);
     40     ~SkLightingImageFilter() override;
     41 
     42     static void RegisterFlattenables();
     43 
     44 protected:
     45     SkLightingImageFilter(sk_sp<SkImageFilterLight> light,
     46                           SkScalar surfaceScale,
     47                           sk_sp<SkImageFilter> input,
     48                           const CropRect* cropRect);
     49     void flatten(SkWriteBuffer&) const override;
     50     const SkImageFilterLight* light() const { return fLight.get(); }
     51     inline sk_sp<const SkImageFilterLight> refLight() const;
     52     SkScalar surfaceScale() const { return fSurfaceScale; }
     53     bool affectsTransparentBlack() const override { return true; }
     54 
     55 private:
     56     sk_sp<SkImageFilterLight> fLight;
     57     SkScalar fSurfaceScale;
     58 
     59     typedef SkImageFilter INHERITED;
     60 };
     61 
     62 #endif
     63