| OLD | NEW | 
|     1 /* |     1 /* | 
|     2  * Copyright 2012 The Android Open Source Project |     2  * Copyright 2012 The Android Open Source Project | 
|     3  * |     3  * | 
|     4  * Use of this source code is governed by a BSD-style license that can be |     4  * Use of this source code is governed by a BSD-style license that can be | 
|     5  * found in the LICENSE file. |     5  * found in the LICENSE file. | 
|     6  */ |     6  */ | 
|     7  |     7  | 
|     8 #include "SkLightingImageFilter.h" |     8 #include "SkLightingImageFilter.h" | 
|     9 #include "SkBitmap.h" |     9 #include "SkBitmap.h" | 
|    10 #include "SkColorPriv.h" |    10 #include "SkColorPriv.h" | 
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   270                     SkScalarIsFinite(point.fZ)); |   270                     SkScalarIsFinite(point.fZ)); | 
|   271     return point; |   271     return point; | 
|   272 }; |   272 }; | 
|   273  |   273  | 
|   274 void writePoint3(const SkPoint3& point, SkWriteBuffer& buffer) { |   274 void writePoint3(const SkPoint3& point, SkWriteBuffer& buffer) { | 
|   275     buffer.writeScalar(point.fX); |   275     buffer.writeScalar(point.fX); | 
|   276     buffer.writeScalar(point.fY); |   276     buffer.writeScalar(point.fY); | 
|   277     buffer.writeScalar(point.fZ); |   277     buffer.writeScalar(point.fZ); | 
|   278 }; |   278 }; | 
|   279  |   279  | 
|   280 class SkDiffuseLightingImageFilter : public SkLightingImageFilter { |   280 enum BoundaryMode { | 
 |   281     kTopLeft_BoundaryMode, | 
 |   282     kTop_BoundaryMode, | 
 |   283     kTopRight_BoundaryMode, | 
 |   284     kLeft_BoundaryMode, | 
 |   285     kInterior_BoundaryMode, | 
 |   286     kRight_BoundaryMode, | 
 |   287     kBottomLeft_BoundaryMode, | 
 |   288     kBottom_BoundaryMode, | 
 |   289     kBottomRight_BoundaryMode, | 
 |   290  | 
 |   291     kBoundaryModeCount, | 
 |   292 }; | 
 |   293  | 
 |   294 class SkLightingImageFilterInternal : public SkLightingImageFilter { | 
 |   295 protected: | 
 |   296     SkLightingImageFilterInternal(SkLight* light, | 
 |   297                                   SkScalar surfaceScale, | 
 |   298                                   SkImageFilter* input, | 
 |   299                                   const CropRect* cropRect) | 
 |   300       : INHERITED(light, surfaceScale, input, cropRect) {} | 
 |   301  | 
 |   302 #if SK_SUPPORT_GPU | 
 |   303     bool canFilterImageGPU() const override { return true; } | 
 |   304     bool filterImageGPU(Proxy*, const SkBitmap& src, const Context&, | 
 |   305                         SkBitmap* result, SkIPoint* offset) const override; | 
 |   306     virtual GrFragmentProcessor* getFragmentProcessor(GrTexture*, | 
 |   307                                                       const SkMatrix&, | 
 |   308                                                       const SkIRect& bounds, | 
 |   309                                                       BoundaryMode boundaryMode)
       const = 0; | 
 |   310 #endif | 
 |   311 private: | 
 |   312 #if SK_SUPPORT_GPU | 
 |   313     void drawRect(GrContext* context, | 
 |   314                   GrTexture* src, | 
 |   315                   GrTexture* dst, | 
 |   316                   const SkMatrix& matrix, | 
 |   317                   const GrClip& clip, | 
 |   318                   const SkRect& dstRect, | 
 |   319                   BoundaryMode boundaryMode, | 
 |   320                   const SkIRect& bounds) const; | 
 |   321 #endif | 
 |   322     typedef SkLightingImageFilter INHERITED; | 
 |   323 }; | 
 |   324  | 
 |   325 #if SK_SUPPORT_GPU | 
 |   326 void SkLightingImageFilterInternal::drawRect(GrContext* context, | 
 |   327                                              GrTexture* src, | 
 |   328                                              GrTexture* dst, | 
 |   329                                              const SkMatrix& matrix, | 
 |   330                                              const GrClip& clip, | 
 |   331                                              const SkRect& dstRect, | 
 |   332                                              BoundaryMode boundaryMode, | 
 |   333                                              const SkIRect& bounds) const { | 
 |   334     SkRect srcRect = dstRect.makeOffset(SkIntToScalar(bounds.x()), SkIntToScalar
      (bounds.y())); | 
 |   335     GrFragmentProcessor* fp = this->getFragmentProcessor(src, matrix, bounds, bo
      undaryMode); | 
 |   336     GrPaint paint; | 
 |   337     paint.addColorProcessor(fp)->unref(); | 
 |   338     context->drawNonAARectToRect(dst->asRenderTarget(), clip, paint, SkMatrix::I
      (), | 
 |   339                                  dstRect, srcRect); | 
 |   340 } | 
 |   341  | 
 |   342 bool SkLightingImageFilterInternal::filterImageGPU(Proxy* proxy, | 
 |   343                                                    const SkBitmap& src, | 
 |   344                                                    const Context& ctx, | 
 |   345                                                    SkBitmap* result, | 
 |   346                                                    SkIPoint* offset) const { | 
 |   347     SkBitmap input = src; | 
 |   348     SkIPoint srcOffset = SkIPoint::Make(0, 0); | 
 |   349     if (this->getInput(0) && | 
 |   350         !this->getInput(0)->getInputResultGPU(proxy, src, ctx, &input, &srcOffse
      t)) { | 
 |   351         return false; | 
 |   352     } | 
 |   353     SkIRect bounds; | 
 |   354     if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &bounds, &input)) { | 
 |   355         return false; | 
 |   356     } | 
 |   357     SkRect dstRect = SkRect::MakeWH(SkIntToScalar(bounds.width()), | 
 |   358                                     SkIntToScalar(bounds.height())); | 
 |   359     GrTexture* srcTexture = input.getTexture(); | 
 |   360     GrContext* context = srcTexture->getContext(); | 
 |   361  | 
 |   362     GrSurfaceDesc desc; | 
 |   363     desc.fFlags = kRenderTarget_GrSurfaceFlag, | 
 |   364     desc.fWidth = bounds.width(); | 
 |   365     desc.fHeight = bounds.height(); | 
 |   366     desc.fConfig = kRGBA_8888_GrPixelConfig; | 
 |   367  | 
 |   368     SkAutoTUnref<GrTexture> dst( | 
 |   369         context->refScratchTexture(desc, GrContext::kApprox_ScratchTexMatch)); | 
 |   370     if (!dst) { | 
 |   371         return false; | 
 |   372     } | 
 |   373  | 
 |   374     // setup new clip | 
 |   375     GrClip clip(dstRect); | 
 |   376  | 
 |   377     offset->fX = bounds.left(); | 
 |   378     offset->fY = bounds.top(); | 
 |   379     SkMatrix matrix(ctx.ctm()); | 
 |   380     matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.to
      p())); | 
 |   381     bounds.offset(-srcOffset); | 
 |   382     SkRect topLeft = SkRect::MakeXYWH(0, 0, 1, 1); | 
 |   383     SkRect top = SkRect::MakeXYWH(1, 0, dstRect.width() - 2, 1); | 
 |   384     SkRect topRight = SkRect::MakeXYWH(dstRect.width() - 1, 0, 1, 1); | 
 |   385     SkRect left = SkRect::MakeXYWH(0, 1, 1, dstRect.height() - 2); | 
 |   386     SkRect interior = dstRect.makeInset(1, 1); | 
 |   387     SkRect right = SkRect::MakeXYWH(dstRect.width() - 1, 1, 1, dstRect.height() 
      - 2); | 
 |   388     SkRect bottomLeft = SkRect::MakeXYWH(0, dstRect.height() - 1, 1, 1); | 
 |   389     SkRect bottom = SkRect::MakeXYWH(1, dstRect.height() - 1, dstRect.width() - 
      2, 1); | 
 |   390     SkRect bottomRight = SkRect::MakeXYWH(dstRect.width() - 1, dstRect.height() 
      - 1, 1, 1); | 
 |   391     this->drawRect(context, srcTexture, dst, matrix, clip, topLeft, kTopLeft_Bou
      ndaryMode, bounds); | 
 |   392     this->drawRect(context, srcTexture, dst, matrix, clip, top, kTop_BoundaryMod
      e, bounds); | 
 |   393     this->drawRect(context, srcTexture, dst, matrix, clip, topRight, kTopRight_B
      oundaryMode, | 
 |   394                    bounds); | 
 |   395     this->drawRect(context, srcTexture, dst, matrix, clip, left, kLeft_BoundaryM
      ode, bounds); | 
 |   396     this->drawRect(context, srcTexture, dst, matrix, clip, interior, kInterior_B
      oundaryMode, | 
 |   397                    bounds); | 
 |   398     this->drawRect(context, srcTexture, dst, matrix, clip, right, kRight_Boundar
      yMode, bounds); | 
 |   399     this->drawRect(context, srcTexture, dst, matrix, clip, bottomLeft, kBottomLe
      ft_BoundaryMode, | 
 |   400                    bounds); | 
 |   401     this->drawRect(context, srcTexture, dst, matrix, clip, bottom, kBottom_Bound
      aryMode, bounds); | 
 |   402     this->drawRect(context, srcTexture, dst, matrix, clip, bottomRight, kBottomR
      ight_BoundaryMode, | 
 |   403                    bounds); | 
 |   404     WrapTexture(dst, bounds.width(), bounds.height(), result); | 
 |   405     return true; | 
 |   406 } | 
 |   407 #endif | 
 |   408  | 
 |   409 class SkDiffuseLightingImageFilter : public SkLightingImageFilterInternal { | 
|   281 public: |   410 public: | 
|   282     static SkImageFilter* Create(SkLight* light, SkScalar surfaceScale, SkScalar
       kd, SkImageFilter*, |   411     static SkImageFilter* Create(SkLight* light, SkScalar surfaceScale, SkScalar
       kd, SkImageFilter*, | 
|   283                                  const CropRect*); |   412                                  const CropRect*); | 
|   284  |   413  | 
|   285     SK_TO_STRING_OVERRIDE() |   414     SK_TO_STRING_OVERRIDE() | 
|   286     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDiffuseLightingImageFi
      lter) |   415     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDiffuseLightingImageFi
      lter) | 
|   287     SkScalar kd() const { return fKD; } |   416     SkScalar kd() const { return fKD; } | 
|   288  |   417  | 
|   289 protected: |   418 protected: | 
|   290     SkDiffuseLightingImageFilter(SkLight* light, SkScalar surfaceScale, |   419     SkDiffuseLightingImageFilter(SkLight* light, SkScalar surfaceScale, | 
|   291                                  SkScalar kd, SkImageFilter* input, const CropRe
      ct* cropRect); |   420                                  SkScalar kd, SkImageFilter* input, const CropRe
      ct* cropRect); | 
|   292     void flatten(SkWriteBuffer& buffer) const override; |   421     void flatten(SkWriteBuffer& buffer) const override; | 
|   293     virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, |   422     bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, | 
|   294                                SkBitmap* result, SkIPoint* offset) const overrid
      e; |   423                        SkBitmap* result, SkIPoint* offset) const override; | 
|   295 #if SK_SUPPORT_GPU |   424 #if SK_SUPPORT_GPU | 
|   296     virtual bool asFragmentProcessor(GrFragmentProcessor**, GrTexture*, const Sk
      Matrix&, |   425     GrFragmentProcessor* getFragmentProcessor(GrTexture*, const SkMatrix&, | 
|   297                                      const SkIRect& bounds) const override; |   426                                               const SkIRect& bounds, BoundaryMod
      e) const override; | 
|   298 #endif |   427 #endif | 
|   299  |   428  | 
|   300 private: |   429 private: | 
|   301     friend class SkLightingImageFilter; |   430     friend class SkLightingImageFilter; | 
|   302     typedef SkLightingImageFilter INHERITED; |   431     typedef SkLightingImageFilterInternal INHERITED; | 
|   303     SkScalar fKD; |   432     SkScalar fKD; | 
|   304 }; |   433 }; | 
|   305  |   434  | 
|   306 class SkSpecularLightingImageFilter : public SkLightingImageFilter { |   435 class SkSpecularLightingImageFilter : public SkLightingImageFilterInternal { | 
|   307 public: |   436 public: | 
|   308     static SkImageFilter* Create(SkLight* light, SkScalar surfaceScale, |   437     static SkImageFilter* Create(SkLight* light, SkScalar surfaceScale, | 
|   309                                  SkScalar ks, SkScalar shininess, SkImageFilter*
      , const CropRect*); |   438                                  SkScalar ks, SkScalar shininess, SkImageFilter*
      , const CropRect*); | 
|   310  |   439  | 
|   311     SK_TO_STRING_OVERRIDE() |   440     SK_TO_STRING_OVERRIDE() | 
|   312     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpecularLightingImageF
      ilter) |   441     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpecularLightingImageF
      ilter) | 
|   313  |   442  | 
|   314     SkScalar ks() const { return fKS; } |   443     SkScalar ks() const { return fKS; } | 
|   315     SkScalar shininess() const { return fShininess; } |   444     SkScalar shininess() const { return fShininess; } | 
|   316  |   445  | 
|   317 protected: |   446 protected: | 
|   318     SkSpecularLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkScala
      r ks, |   447     SkSpecularLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkScala
      r ks, | 
|   319                                   SkScalar shininess, SkImageFilter* input, cons
      t CropRect*); |   448                                   SkScalar shininess, SkImageFilter* input, cons
      t CropRect*); | 
|   320     void flatten(SkWriteBuffer& buffer) const override; |   449     void flatten(SkWriteBuffer& buffer) const override; | 
|   321     virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, |   450     bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, | 
|   322                                SkBitmap* result, SkIPoint* offset) const overrid
      e; |   451                        SkBitmap* result, SkIPoint* offset) const override; | 
|   323 #if SK_SUPPORT_GPU |   452 #if SK_SUPPORT_GPU | 
|   324     virtual bool asFragmentProcessor(GrFragmentProcessor**, GrTexture*, const Sk
      Matrix&, |   453     GrFragmentProcessor* getFragmentProcessor(GrTexture*, const SkMatrix&, | 
|   325                                      const SkIRect& bounds) const override; |   454                                               const SkIRect& bounds, BoundaryMod
      e) const override; | 
|   326 #endif |   455 #endif | 
|   327  |   456  | 
|   328 private: |   457 private: | 
|   329     SkScalar fKS; |   458     SkScalar fKS; | 
|   330     SkScalar fShininess; |   459     SkScalar fShininess; | 
|   331     friend class SkLightingImageFilter; |   460     friend class SkLightingImageFilter; | 
|   332     typedef SkLightingImageFilter INHERITED; |   461     typedef SkLightingImageFilterInternal INHERITED; | 
|   333 }; |   462 }; | 
|   334  |   463  | 
|   335 #if SK_SUPPORT_GPU |   464 #if SK_SUPPORT_GPU | 
|   336  |   465  | 
|   337 class GrLightingEffect : public GrSingleTextureEffect { |   466 class GrLightingEffect : public GrSingleTextureEffect { | 
|   338 public: |   467 public: | 
|   339     GrLightingEffect(GrTexture* texture, const SkLight* light, SkScalar surfaceS
      cale, const SkMatrix& matrix); |   468     GrLightingEffect(GrTexture* texture, const SkLight* light, SkScalar surfaceS
      cale, | 
 |   469                      const SkMatrix& matrix, BoundaryMode boundaryMode); | 
|   340     virtual ~GrLightingEffect(); |   470     virtual ~GrLightingEffect(); | 
|   341  |   471  | 
|   342     const SkLight* light() const { return fLight; } |   472     const SkLight* light() const { return fLight; } | 
|   343     SkScalar surfaceScale() const { return fSurfaceScale; } |   473     SkScalar surfaceScale() const { return fSurfaceScale; } | 
|   344     const SkMatrix& filterMatrix() const { return fFilterMatrix; } |   474     const SkMatrix& filterMatrix() const { return fFilterMatrix; } | 
 |   475     BoundaryMode boundaryMode() const { return fBoundaryMode; } | 
|   345  |   476  | 
|   346 protected: |   477 protected: | 
|   347     bool onIsEqual(const GrFragmentProcessor&) const override; |   478     bool onIsEqual(const GrFragmentProcessor&) const override; | 
|   348  |   479  | 
|   349     void onComputeInvariantOutput(GrInvariantOutput* inout) const override { |   480     void onComputeInvariantOutput(GrInvariantOutput* inout) const override { | 
|   350         // lighting shaders are complicated. We just throw up our hands. |   481         // lighting shaders are complicated. We just throw up our hands. | 
|   351         inout->mulByUnknownFourComponents(); |   482         inout->mulByUnknownFourComponents(); | 
|   352     } |   483     } | 
|   353  |   484  | 
|   354 private: |   485 private: | 
|   355     typedef GrSingleTextureEffect INHERITED; |   486     typedef GrSingleTextureEffect INHERITED; | 
|   356     const SkLight* fLight; |   487     const SkLight* fLight; | 
|   357     SkScalar fSurfaceScale; |   488     SkScalar fSurfaceScale; | 
|   358     SkMatrix fFilterMatrix; |   489     SkMatrix fFilterMatrix; | 
 |   490     BoundaryMode fBoundaryMode; | 
|   359 }; |   491 }; | 
|   360  |   492  | 
|   361 class GrDiffuseLightingEffect : public GrLightingEffect { |   493 class GrDiffuseLightingEffect : public GrLightingEffect { | 
|   362 public: |   494 public: | 
|   363     static GrFragmentProcessor* Create(GrTexture* texture, |   495     static GrFragmentProcessor* Create(GrTexture* texture, | 
|   364                                        const SkLight* light, |   496                                        const SkLight* light, | 
|   365                                        SkScalar surfaceScale, |   497                                        SkScalar surfaceScale, | 
|   366                                        const SkMatrix& matrix, |   498                                        const SkMatrix& matrix, | 
|   367                                        SkScalar kd) { |   499                                        SkScalar kd, | 
 |   500                                        BoundaryMode boundaryMode) { | 
|   368         return SkNEW_ARGS(GrDiffuseLightingEffect, (texture, |   501         return SkNEW_ARGS(GrDiffuseLightingEffect, (texture, | 
|   369                                                     light, |   502                                                     light, | 
|   370                                                     surfaceScale, |   503                                                     surfaceScale, | 
|   371                                                     matrix, |   504                                                     matrix, | 
|   372                                                     kd)); |   505                                                     kd, | 
 |   506                                                     boundaryMode)); | 
|   373     } |   507     } | 
|   374  |   508  | 
|   375     const char* name() const override { return "DiffuseLighting"; } |   509     const char* name() const override { return "DiffuseLighting"; } | 
|   376  |   510  | 
|   377     void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) const overri
      de; |   511     void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) const overri
      de; | 
|   378  |   512  | 
|   379     GrGLFragmentProcessor* createGLInstance() const override; |   513     GrGLFragmentProcessor* createGLInstance() const override; | 
|   380  |   514  | 
|   381     SkScalar kd() const { return fKD; } |   515     SkScalar kd() const { return fKD; } | 
|   382  |   516  | 
|   383 private: |   517 private: | 
|   384     bool onIsEqual(const GrFragmentProcessor&) const override; |   518     bool onIsEqual(const GrFragmentProcessor&) const override; | 
|   385  |   519  | 
|   386     GrDiffuseLightingEffect(GrTexture* texture, |   520     GrDiffuseLightingEffect(GrTexture* texture, | 
|   387                             const SkLight* light, |   521                             const SkLight* light, | 
|   388                             SkScalar surfaceScale, |   522                             SkScalar surfaceScale, | 
|   389                             const SkMatrix& matrix, |   523                             const SkMatrix& matrix, | 
|   390                             SkScalar kd); |   524                             SkScalar kd, | 
 |   525                             BoundaryMode boundaryMode); | 
|   391  |   526  | 
|   392     GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |   527     GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 
|   393     typedef GrLightingEffect INHERITED; |   528     typedef GrLightingEffect INHERITED; | 
|   394     SkScalar fKD; |   529     SkScalar fKD; | 
|   395 }; |   530 }; | 
|   396  |   531  | 
|   397 class GrSpecularLightingEffect : public GrLightingEffect { |   532 class GrSpecularLightingEffect : public GrLightingEffect { | 
|   398 public: |   533 public: | 
|   399     static GrFragmentProcessor* Create(GrTexture* texture, |   534     static GrFragmentProcessor* Create(GrTexture* texture, | 
|   400                                        const SkLight* light, |   535                                        const SkLight* light, | 
|   401                                        SkScalar surfaceScale, |   536                                        SkScalar surfaceScale, | 
|   402                                        const SkMatrix& matrix, |   537                                        const SkMatrix& matrix, | 
|   403                                        SkScalar ks, |   538                                        SkScalar ks, | 
|   404                                        SkScalar shininess) { |   539                                        SkScalar shininess, | 
 |   540                                        BoundaryMode boundaryMode) { | 
|   405         return SkNEW_ARGS(GrSpecularLightingEffect, (texture, |   541         return SkNEW_ARGS(GrSpecularLightingEffect, (texture, | 
|   406                                                      light, |   542                                                      light, | 
|   407                                                      surfaceScale, |   543                                                      surfaceScale, | 
|   408                                                      matrix, |   544                                                      matrix, | 
|   409                                                      ks, |   545                                                      ks, | 
|   410                                                      shininess)); |   546                                                      shininess, | 
 |   547                                                      boundaryMode)); | 
|   411     } |   548     } | 
|   412  |   549  | 
|   413     const char* name() const override { return "SpecularLighting"; } |   550     const char* name() const override { return "SpecularLighting"; } | 
|   414  |   551  | 
|   415     void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) const overri
      de; |   552     void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) const overri
      de; | 
|   416  |   553  | 
|   417     GrGLFragmentProcessor* createGLInstance() const override; |   554     GrGLFragmentProcessor* createGLInstance() const override; | 
|   418  |   555  | 
|   419     SkScalar ks() const { return fKS; } |   556     SkScalar ks() const { return fKS; } | 
|   420     SkScalar shininess() const { return fShininess; } |   557     SkScalar shininess() const { return fShininess; } | 
|   421  |   558  | 
|   422 private: |   559 private: | 
|   423     bool onIsEqual(const GrFragmentProcessor&) const override; |   560     bool onIsEqual(const GrFragmentProcessor&) const override; | 
|   424  |   561  | 
|   425     GrSpecularLightingEffect(GrTexture* texture, |   562     GrSpecularLightingEffect(GrTexture* texture, | 
|   426                              const SkLight* light, |   563                              const SkLight* light, | 
|   427                              SkScalar surfaceScale, |   564                              SkScalar surfaceScale, | 
|   428                              const SkMatrix& matrix, |   565                              const SkMatrix& matrix, | 
|   429                              SkScalar ks, |   566                              SkScalar ks, | 
|   430                              SkScalar shininess); |   567                              SkScalar shininess, | 
 |   568                              BoundaryMode boundaryMode); | 
|   431  |   569  | 
|   432     GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |   570     GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 
|   433     typedef GrLightingEffect INHERITED; |   571     typedef GrLightingEffect INHERITED; | 
|   434     SkScalar fKS; |   572     SkScalar fKS; | 
|   435     SkScalar fShininess; |   573     SkScalar fShininess; | 
|   436 }; |   574 }; | 
|   437  |   575  | 
|   438 /////////////////////////////////////////////////////////////////////////////// |   576 /////////////////////////////////////////////////////////////////////////////// | 
|   439  |   577  | 
|   440 class GrGLLight { |   578 class GrGLLight { | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   474     UniformHandle fColorUni; |   612     UniformHandle fColorUni; | 
|   475  |   613  | 
|   476     typedef SkRefCnt INHERITED; |   614     typedef SkRefCnt INHERITED; | 
|   477 }; |   615 }; | 
|   478  |   616  | 
|   479 /////////////////////////////////////////////////////////////////////////////// |   617 /////////////////////////////////////////////////////////////////////////////// | 
|   480  |   618  | 
|   481 class GrGLDistantLight : public GrGLLight { |   619 class GrGLDistantLight : public GrGLLight { | 
|   482 public: |   620 public: | 
|   483     virtual ~GrGLDistantLight() {} |   621     virtual ~GrGLDistantLight() {} | 
|   484     virtual void setData(const GrGLProgramDataManager&, |   622     void setData(const GrGLProgramDataManager&, const SkLight* light) const over
      ride; | 
|   485                          const SkLight* light) const override; |  | 
|   486     void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; |   623     void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; | 
|   487  |   624  | 
|   488 private: |   625 private: | 
|   489     typedef GrGLLight INHERITED; |   626     typedef GrGLLight INHERITED; | 
|   490     UniformHandle fDirectionUni; |   627     UniformHandle fDirectionUni; | 
|   491 }; |   628 }; | 
|   492  |   629  | 
|   493 /////////////////////////////////////////////////////////////////////////////// |   630 /////////////////////////////////////////////////////////////////////////////// | 
|   494  |   631  | 
|   495 class GrGLPointLight : public GrGLLight { |   632 class GrGLPointLight : public GrGLLight { | 
|   496 public: |   633 public: | 
|   497     virtual ~GrGLPointLight() {} |   634     virtual ~GrGLPointLight() {} | 
|   498     virtual void setData(const GrGLProgramDataManager&, |   635     void setData(const GrGLProgramDataManager&, const SkLight* light) const over
      ride; | 
|   499                          const SkLight* light) const override; |  | 
|   500     void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; |   636     void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; | 
|   501  |   637  | 
|   502 private: |   638 private: | 
|   503     typedef GrGLLight INHERITED; |   639     typedef GrGLLight INHERITED; | 
|   504     UniformHandle fLocationUni; |   640     UniformHandle fLocationUni; | 
|   505 }; |   641 }; | 
|   506  |   642  | 
|   507 /////////////////////////////////////////////////////////////////////////////// |   643 /////////////////////////////////////////////////////////////////////////////// | 
|   508  |   644  | 
|   509 class GrGLSpotLight : public GrGLLight { |   645 class GrGLSpotLight : public GrGLLight { | 
|   510 public: |   646 public: | 
|   511     virtual ~GrGLSpotLight() {} |   647     virtual ~GrGLSpotLight() {} | 
|   512     virtual void setData(const GrGLProgramDataManager&, |   648     void setData(const GrGLProgramDataManager&, const SkLight* light) const over
      ride; | 
|   513                          const SkLight* light) const override; |  | 
|   514     void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; |   649     void emitSurfaceToLight(GrGLFPBuilder*, const char* z) override; | 
|   515     void emitLightColor(GrGLFPBuilder*, const char *surfaceToLight) override; |   650     void emitLightColor(GrGLFPBuilder*, const char *surfaceToLight) override; | 
|   516  |   651  | 
|   517 private: |   652 private: | 
|   518     typedef GrGLLight INHERITED; |   653     typedef GrGLLight INHERITED; | 
|   519  |   654  | 
|   520     SkString        fLightColorFunc; |   655     SkString        fLightColorFunc; | 
|   521     UniformHandle   fLocationUni; |   656     UniformHandle   fLocationUni; | 
|   522     UniformHandle   fExponentUni; |   657     UniformHandle   fExponentUni; | 
|   523     UniformHandle   fCosOuterConeAngleUni; |   658     UniformHandle   fCosOuterConeAngleUni; | 
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   688  |   823  | 
|   689 private: |   824 private: | 
|   690     typedef SkLight INHERITED; |   825     typedef SkLight INHERITED; | 
|   691     SkPoint3 fLocation; |   826     SkPoint3 fLocation; | 
|   692 }; |   827 }; | 
|   693  |   828  | 
|   694 /////////////////////////////////////////////////////////////////////////////// |   829 /////////////////////////////////////////////////////////////////////////////// | 
|   695  |   830  | 
|   696 class SkSpotLight : public SkLight { |   831 class SkSpotLight : public SkLight { | 
|   697 public: |   832 public: | 
|   698     SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu
      larExponent, SkScalar cutoffAngle, SkColor color) |   833     SkSpotLight(const SkPoint3& location, | 
 |   834                 const SkPoint3& target, | 
 |   835                 SkScalar specularExponent, | 
 |   836                 SkScalar cutoffAngle, | 
 |   837                 SkColor color) | 
|   699      : INHERITED(color), |   838      : INHERITED(color), | 
|   700        fLocation(location), |   839        fLocation(location), | 
|   701        fTarget(target), |   840        fTarget(target), | 
|   702        fSpecularExponent(SkScalarPin(specularExponent, kSpecularExponentMin, kSp
      ecularExponentMax)) |   841        fSpecularExponent(SkScalarPin(specularExponent, kSpecularExponentMin, kSp
      ecularExponentMax)) | 
|   703     { |   842     { | 
|   704        fS = target - location; |   843        fS = target - location; | 
|   705        fS.normalize(); |   844        fS.normalize(); | 
|   706        fCosOuterConeAngle = SkScalarCos(SkDegreesToRadians(cutoffAngle)); |   845        fCosOuterConeAngle = SkScalarCos(SkDegreesToRadians(cutoffAngle)); | 
|   707        const SkScalar antiAliasThreshold = 0.016f; |   846        const SkScalar antiAliasThreshold = 0.016f; | 
|   708        fCosInnerConeAngle = fCosOuterConeAngle + antiAliasThreshold; |   847        fCosInnerConeAngle = fCosOuterConeAngle + antiAliasThreshold; | 
|   709        fConeScale = SkScalarInvert(antiAliasThreshold); |   848        fConeScale = SkScalarInvert(antiAliasThreshold); | 
|   710     } |   849     } | 
|   711  |   850  | 
|   712     SkLight* transform(const SkMatrix& matrix) const override { |   851     SkLight* transform(const SkMatrix& matrix) const override { | 
|   713         SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY); |   852         SkPoint location2 = SkPoint::Make(fLocation.fX, fLocation.fY); | 
|   714         matrix.mapPoints(&location2, 1); |   853         matrix.mapPoints(&location2, 1); | 
|   715         // Use X scale and Y scale on Z and average the result |   854         // Use X scale and Y scale on Z and average the result | 
|   716         SkPoint locationZ = SkPoint::Make(fLocation.fZ, fLocation.fZ); |   855         SkPoint locationZ = SkPoint::Make(fLocation.fZ, fLocation.fZ); | 
|   717         matrix.mapVectors(&locationZ, 1); |   856         matrix.mapVectors(&locationZ, 1); | 
|   718         SkPoint3 location(location2.fX, location2.fY, SkScalarAve(locationZ.fX, 
      locationZ.fY)); |   857         SkPoint3 location(location2.fX, location2.fY, SkScalarAve(locationZ.fX, 
      locationZ.fY)); | 
|   719         SkPoint target2 = SkPoint::Make(fTarget.fX, fTarget.fY); |   858         SkPoint target2 = SkPoint::Make(fTarget.fX, fTarget.fY); | 
|   720         matrix.mapPoints(&target2, 1); |   859         matrix.mapPoints(&target2, 1); | 
|   721         SkPoint targetZ = SkPoint::Make(fTarget.fZ, fTarget.fZ); |   860         SkPoint targetZ = SkPoint::Make(fTarget.fZ, fTarget.fZ); | 
|   722         matrix.mapVectors(&targetZ, 1); |   861         matrix.mapVectors(&targetZ, 1); | 
|   723         SkPoint3 target(target2.fX, target2.fY, SkScalarAve(targetZ.fX, targetZ.
      fY)); |   862         SkPoint3 target(target2.fX, target2.fY, SkScalarAve(targetZ.fX, targetZ.
      fY)); | 
|   724         SkPoint3 s = target - location; |   863         SkPoint3 s = target - location; | 
|   725         s.normalize(); |   864         s.normalize(); | 
|   726         return new SkSpotLight(location, target, fSpecularExponent, fCosOuterCon
      eAngle, fCosInnerConeAngle, fConeScale, s, color()); |   865         return new SkSpotLight(location, | 
 |   866                                target, | 
 |   867                                fSpecularExponent, | 
 |   868                                fCosOuterConeAngle, | 
 |   869                                fCosInnerConeAngle, | 
 |   870                                fConeScale, | 
 |   871                                s, | 
 |   872                                color()); | 
|   727     } |   873     } | 
|   728  |   874  | 
|   729     SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const { |   875     SkPoint3 surfaceToLight(int x, int y, int z, SkScalar surfaceScale) const { | 
|   730         SkPoint3 direction(fLocation.fX - SkIntToScalar(x), |   876         SkPoint3 direction(fLocation.fX - SkIntToScalar(x), | 
|   731                            fLocation.fY - SkIntToScalar(y), |   877                            fLocation.fY - SkIntToScalar(y), | 
|   732                            fLocation.fZ - SkScalarMul(SkIntToScalar(z), surfaceS
      cale)); |   878                            fLocation.fZ - SkScalarMul(SkIntToScalar(z), surfaceS
      cale)); | 
|   733         direction.normalize(); |   879         direction.normalize(); | 
|   734         return direction; |   880         return direction; | 
|   735     }; |   881     }; | 
|   736     SkPoint3 lightColor(const SkPoint3& surfaceToLight) const { |   882     SkPoint3 lightColor(const SkPoint3& surfaceToLight) const { | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   770         fCosOuterConeAngle = buffer.readScalar(); |   916         fCosOuterConeAngle = buffer.readScalar(); | 
|   771         fCosInnerConeAngle = buffer.readScalar(); |   917         fCosInnerConeAngle = buffer.readScalar(); | 
|   772         fConeScale = buffer.readScalar(); |   918         fConeScale = buffer.readScalar(); | 
|   773         fS = readPoint3(buffer); |   919         fS = readPoint3(buffer); | 
|   774         buffer.validate(SkScalarIsFinite(fSpecularExponent) && |   920         buffer.validate(SkScalarIsFinite(fSpecularExponent) && | 
|   775                         SkScalarIsFinite(fCosOuterConeAngle) && |   921                         SkScalarIsFinite(fCosOuterConeAngle) && | 
|   776                         SkScalarIsFinite(fCosInnerConeAngle) && |   922                         SkScalarIsFinite(fCosInnerConeAngle) && | 
|   777                         SkScalarIsFinite(fConeScale)); |   923                         SkScalarIsFinite(fConeScale)); | 
|   778     } |   924     } | 
|   779 protected: |   925 protected: | 
|   780     SkSpotLight(const SkPoint3& location, const SkPoint3& target, SkScalar specu
      larExponent, SkScalar cosOuterConeAngle, SkScalar cosInnerConeAngle, SkScalar co
      neScale, const SkPoint3& s, const SkPoint3& color) |   926     SkSpotLight(const SkPoint3& location, | 
 |   927                 const SkPoint3& target, | 
 |   928                 SkScalar specularExponent, | 
 |   929                 SkScalar cosOuterConeAngle, | 
 |   930                 SkScalar cosInnerConeAngle, | 
 |   931                 SkScalar coneScale, | 
 |   932                 const SkPoint3& s, | 
 |   933                 const SkPoint3& color) | 
|   781      : INHERITED(color), |   934      : INHERITED(color), | 
|   782        fLocation(location), |   935        fLocation(location), | 
|   783        fTarget(target), |   936        fTarget(target), | 
|   784        fSpecularExponent(specularExponent), |   937        fSpecularExponent(specularExponent), | 
|   785        fCosOuterConeAngle(cosOuterConeAngle), |   938        fCosOuterConeAngle(cosOuterConeAngle), | 
|   786        fCosInnerConeAngle(cosInnerConeAngle), |   939        fCosInnerConeAngle(cosInnerConeAngle), | 
|   787        fConeScale(coneScale), |   940        fConeScale(coneScale), | 
|   788        fS(s) |   941        fS(s) | 
|   789     { |   942     { | 
|   790     } |   943     } | 
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   953         return NULL; |  1106         return NULL; | 
|   954     } |  1107     } | 
|   955     // According to the spec, kd can be any non-negative number : |  1108     // According to the spec, kd can be any non-negative number : | 
|   956     // http://www.w3.org/TR/SVG/filters.html#feDiffuseLightingElement |  1109     // http://www.w3.org/TR/SVG/filters.html#feDiffuseLightingElement | 
|   957     if (kd < 0) { |  1110     if (kd < 0) { | 
|   958         return NULL; |  1111         return NULL; | 
|   959     } |  1112     } | 
|   960     return SkNEW_ARGS(SkDiffuseLightingImageFilter, (light, surfaceScale, kd, in
      put, cropRect)); |  1113     return SkNEW_ARGS(SkDiffuseLightingImageFilter, (light, surfaceScale, kd, in
      put, cropRect)); | 
|   961 } |  1114 } | 
|   962  |  1115  | 
|   963 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, SkSca
      lar surfaceScale, SkScalar kd, SkImageFilter* input, const CropRect* cropRect) |  1116 SkDiffuseLightingImageFilter::SkDiffuseLightingImageFilter(SkLight* light, | 
|   964   : SkLightingImageFilter(light, surfaceScale, input, cropRect), |  1117                                                            SkScalar surfaceScale
      , | 
 |  1118                                                            SkScalar kd, | 
 |  1119                                                            SkImageFilter* input, | 
 |  1120                                                            const CropRect* cropR
      ect) | 
 |  1121   : INHERITED(light, surfaceScale, input, cropRect), | 
|   965     fKD(kd) |  1122     fKD(kd) | 
|   966 { |  1123 { | 
|   967 } |  1124 } | 
|   968  |  1125  | 
|   969 SkFlattenable* SkDiffuseLightingImageFilter::CreateProc(SkReadBuffer& buffer) { |  1126 SkFlattenable* SkDiffuseLightingImageFilter::CreateProc(SkReadBuffer& buffer) { | 
|   970     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); |  1127     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); | 
|   971     SkAutoTUnref<SkLight> light(SkLight::UnflattenLight(buffer)); |  1128     SkAutoTUnref<SkLight> light(SkLight::UnflattenLight(buffer)); | 
|   972     SkScalar surfaceScale = buffer.readScalar(); |  1129     SkScalar surfaceScale = buffer.readScalar(); | 
|   973     SkScalar kd = buffer.readScalar(); |  1130     SkScalar kd = buffer.readScalar(); | 
|   974     return Create(light, surfaceScale, kd, common.getInput(0), &common.cropRect(
      )); |  1131     return Create(light, surfaceScale, kd, common.getInput(0), &common.cropRect(
      )); | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1013     } |  1170     } | 
|  1014  |  1171  | 
|  1015     SkAutoTUnref<SkLight> transformedLight(light()->transform(ctx.ctm())); |  1172     SkAutoTUnref<SkLight> transformedLight(light()->transform(ctx.ctm())); | 
|  1016  |  1173  | 
|  1017     DiffuseLightingType lightingType(fKD); |  1174     DiffuseLightingType lightingType(fKD); | 
|  1018     offset->fX = bounds.left(); |  1175     offset->fX = bounds.left(); | 
|  1019     offset->fY = bounds.top(); |  1176     offset->fY = bounds.top(); | 
|  1020     bounds.offset(-srcOffset); |  1177     bounds.offset(-srcOffset); | 
|  1021     switch (transformedLight->type()) { |  1178     switch (transformedLight->type()) { | 
|  1022         case SkLight::kDistant_LightType: |  1179         case SkLight::kDistant_LightType: | 
|  1023             lightBitmap<DiffuseLightingType, SkDistantLight>(lightingType, trans
      formedLight, src, dst, surfaceScale(), bounds); |  1180             lightBitmap<DiffuseLightingType, SkDistantLight>(lightingType, | 
 |  1181                                                              transformedLight, | 
 |  1182                                                              src, | 
 |  1183                                                              dst, | 
 |  1184                                                              surfaceScale(), | 
 |  1185                                                              bounds); | 
|  1024             break; |  1186             break; | 
|  1025         case SkLight::kPoint_LightType: |  1187         case SkLight::kPoint_LightType: | 
|  1026             lightBitmap<DiffuseLightingType, SkPointLight>(lightingType, transfo
      rmedLight, src, dst, surfaceScale(), bounds); |  1188             lightBitmap<DiffuseLightingType, SkPointLight>(lightingType, | 
 |  1189                                                            transformedLight, | 
 |  1190                                                            src, | 
 |  1191                                                            dst, | 
 |  1192                                                            surfaceScale(), | 
 |  1193                                                            bounds); | 
|  1027             break; |  1194             break; | 
|  1028         case SkLight::kSpot_LightType: |  1195         case SkLight::kSpot_LightType: | 
|  1029             lightBitmap<DiffuseLightingType, SkSpotLight>(lightingType, transfor
      medLight, src, dst, surfaceScale(), bounds); |  1196             lightBitmap<DiffuseLightingType, SkSpotLight>(lightingType, | 
 |  1197                                                           transformedLight, | 
 |  1198                                                           src, | 
 |  1199                                                           dst, | 
 |  1200                                                           surfaceScale(), | 
 |  1201                                                           bounds); | 
|  1030             break; |  1202             break; | 
|  1031     } |  1203     } | 
|  1032  |  1204  | 
|  1033     return true; |  1205     return true; | 
|  1034 } |  1206 } | 
|  1035  |  1207  | 
|  1036 #ifndef SK_IGNORE_TO_STRING |  1208 #ifndef SK_IGNORE_TO_STRING | 
|  1037 void SkDiffuseLightingImageFilter::toString(SkString* str) const { |  1209 void SkDiffuseLightingImageFilter::toString(SkString* str) const { | 
|  1038     str->appendf("SkDiffuseLightingImageFilter: ("); |  1210     str->appendf("SkDiffuseLightingImageFilter: ("); | 
|  1039     str->appendf("kD: %f\n", fKD); |  1211     str->appendf("kD: %f\n", fKD); | 
|  1040     str->append(")"); |  1212     str->append(")"); | 
|  1041 } |  1213 } | 
|  1042 #endif |  1214 #endif | 
|  1043  |  1215  | 
|  1044 #if SK_SUPPORT_GPU |  1216 #if SK_SUPPORT_GPU | 
|  1045 bool SkDiffuseLightingImageFilter::asFragmentProcessor(GrFragmentProcessor** fp, |  1217 GrFragmentProcessor* SkDiffuseLightingImageFilter::getFragmentProcessor( | 
|  1046                                                        GrTexture* texture, |  1218                                                        GrTexture* texture, | 
|  1047                                                        const SkMatrix& matrix, |  1219                                                        const SkMatrix& matrix, | 
|  1048                                                        const SkIRect&) const { |  1220                                                        const SkIRect&, | 
|  1049     if (fp) { |  1221                                                        BoundaryMode boundaryMode | 
|  1050         SkScalar scale = SkScalarMul(surfaceScale(), SkIntToScalar(255)); |  1222 ) const { | 
|  1051         *fp = GrDiffuseLightingEffect::Create(texture, light(), scale, matrix, k
      d()); |  1223     SkScalar scale = SkScalarMul(surfaceScale(), SkIntToScalar(255)); | 
|  1052     } |  1224     return GrDiffuseLightingEffect::Create(texture, light(), scale, matrix, kd()
      , boundaryMode); | 
|  1053     return true; |  | 
|  1054 } |  1225 } | 
|  1055 #endif |  1226 #endif | 
|  1056  |  1227  | 
|  1057 /////////////////////////////////////////////////////////////////////////////// |  1228 /////////////////////////////////////////////////////////////////////////////// | 
|  1058  |  1229  | 
|  1059 SkImageFilter* SkSpecularLightingImageFilter::Create(SkLight* light, SkScalar su
      rfaceScale, |  1230 SkImageFilter* SkSpecularLightingImageFilter::Create(SkLight* light, SkScalar su
      rfaceScale, | 
|  1060                 SkScalar ks, SkScalar shininess, SkImageFilter* input, const Cro
      pRect* cropRect) { |  1231                 SkScalar ks, SkScalar shininess, SkImageFilter* input, const Cro
      pRect* cropRect) { | 
|  1061     if (NULL == light) { |  1232     if (NULL == light) { | 
|  1062         return NULL; |  1233         return NULL; | 
|  1063     } |  1234     } | 
|  1064     if (!SkScalarIsFinite(surfaceScale) || !SkScalarIsFinite(ks) || !SkScalarIsF
      inite(shininess)) { |  1235     if (!SkScalarIsFinite(surfaceScale) || !SkScalarIsFinite(ks) || !SkScalarIsF
      inite(shininess)) { | 
|  1065         return NULL; |  1236         return NULL; | 
|  1066     } |  1237     } | 
|  1067     // According to the spec, ks can be any non-negative number : |  1238     // According to the spec, ks can be any non-negative number : | 
|  1068     // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingElement |  1239     // http://www.w3.org/TR/SVG/filters.html#feSpecularLightingElement | 
|  1069     if (ks < 0) { |  1240     if (ks < 0) { | 
|  1070         return NULL; |  1241         return NULL; | 
|  1071     } |  1242     } | 
|  1072     return SkNEW_ARGS(SkSpecularLightingImageFilter, |  1243     return SkNEW_ARGS(SkSpecularLightingImageFilter, | 
|  1073                       (light, surfaceScale, ks, shininess, input, cropRect)); |  1244                       (light, surfaceScale, ks, shininess, input, cropRect)); | 
|  1074 } |  1245 } | 
|  1075  |  1246  | 
|  1076 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkLight* light, SkS
      calar surfaceScale, SkScalar ks, SkScalar shininess, SkImageFilter* input, const
       CropRect* cropRect) |  1247 SkSpecularLightingImageFilter::SkSpecularLightingImageFilter(SkLight* light, | 
|  1077   : SkLightingImageFilter(light, surfaceScale, input, cropRect), |  1248                                                              SkScalar surfaceSca
      le, | 
 |  1249                                                              SkScalar ks, | 
 |  1250                                                              SkScalar shininess, | 
 |  1251                                                              SkImageFilter* inpu
      t, | 
 |  1252                                                              const CropRect* cro
      pRect) | 
 |  1253   : INHERITED(light, surfaceScale, input, cropRect), | 
|  1078     fKS(ks), |  1254     fKS(ks), | 
|  1079     fShininess(shininess) |  1255     fShininess(shininess) | 
|  1080 { |  1256 { | 
|  1081 } |  1257 } | 
|  1082  |  1258  | 
|  1083 SkFlattenable* SkSpecularLightingImageFilter::CreateProc(SkReadBuffer& buffer) { |  1259 SkFlattenable* SkSpecularLightingImageFilter::CreateProc(SkReadBuffer& buffer) { | 
|  1084     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); |  1260     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); | 
|  1085     SkAutoTUnref<SkLight> light(SkLight::UnflattenLight(buffer)); |  1261     SkAutoTUnref<SkLight> light(SkLight::UnflattenLight(buffer)); | 
|  1086     SkScalar surfaceScale = buffer.readScalar(); |  1262     SkScalar surfaceScale = buffer.readScalar(); | 
|  1087     SkScalar ks = buffer.readScalar(); |  1263     SkScalar ks = buffer.readScalar(); | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1129         return false; |  1305         return false; | 
|  1130     } |  1306     } | 
|  1131  |  1307  | 
|  1132     SpecularLightingType lightingType(fKS, fShininess); |  1308     SpecularLightingType lightingType(fKS, fShininess); | 
|  1133     offset->fX = bounds.left(); |  1309     offset->fX = bounds.left(); | 
|  1134     offset->fY = bounds.top(); |  1310     offset->fY = bounds.top(); | 
|  1135     bounds.offset(-srcOffset); |  1311     bounds.offset(-srcOffset); | 
|  1136     SkAutoTUnref<SkLight> transformedLight(light()->transform(ctx.ctm())); |  1312     SkAutoTUnref<SkLight> transformedLight(light()->transform(ctx.ctm())); | 
|  1137     switch (transformedLight->type()) { |  1313     switch (transformedLight->type()) { | 
|  1138         case SkLight::kDistant_LightType: |  1314         case SkLight::kDistant_LightType: | 
|  1139             lightBitmap<SpecularLightingType, SkDistantLight>(lightingType, tran
      sformedLight, src, dst, surfaceScale(), bounds); |  1315             lightBitmap<SpecularLightingType, SkDistantLight>(lightingType, | 
 |  1316                                                               transformedLight, | 
 |  1317                                                               src, | 
 |  1318                                                               dst, | 
 |  1319                                                               surfaceScale(), | 
 |  1320                                                               bounds); | 
|  1140             break; |  1321             break; | 
|  1141         case SkLight::kPoint_LightType: |  1322         case SkLight::kPoint_LightType: | 
|  1142             lightBitmap<SpecularLightingType, SkPointLight>(lightingType, transf
      ormedLight, src, dst, surfaceScale(), bounds); |  1323             lightBitmap<SpecularLightingType, SkPointLight>(lightingType, | 
 |  1324                                                             transformedLight, | 
 |  1325                                                             src, | 
 |  1326                                                             dst, | 
 |  1327                                                             surfaceScale(), | 
 |  1328                                                             bounds); | 
|  1143             break; |  1329             break; | 
|  1144         case SkLight::kSpot_LightType: |  1330         case SkLight::kSpot_LightType: | 
|  1145             lightBitmap<SpecularLightingType, SkSpotLight>(lightingType, transfo
      rmedLight, src, dst, surfaceScale(), bounds); |  1331             lightBitmap<SpecularLightingType, SkSpotLight>(lightingType, | 
 |  1332                                                            transformedLight, | 
 |  1333                                                            src, | 
 |  1334                                                            dst, | 
 |  1335                                                            surfaceScale(), | 
 |  1336                                                            bounds); | 
|  1146             break; |  1337             break; | 
|  1147     } |  1338     } | 
|  1148     return true; |  1339     return true; | 
|  1149 } |  1340 } | 
|  1150  |  1341  | 
|  1151 #ifndef SK_IGNORE_TO_STRING |  1342 #ifndef SK_IGNORE_TO_STRING | 
|  1152 void SkSpecularLightingImageFilter::toString(SkString* str) const { |  1343 void SkSpecularLightingImageFilter::toString(SkString* str) const { | 
|  1153     str->appendf("SkSpecularLightingImageFilter: ("); |  1344     str->appendf("SkSpecularLightingImageFilter: ("); | 
|  1154     str->appendf("kS: %f shininess: %f", fKS, fShininess); |  1345     str->appendf("kS: %f shininess: %f", fKS, fShininess); | 
|  1155     str->append(")"); |  1346     str->append(")"); | 
|  1156 } |  1347 } | 
|  1157 #endif |  1348 #endif | 
|  1158  |  1349  | 
|  1159 #if SK_SUPPORT_GPU |  1350 #if SK_SUPPORT_GPU | 
|  1160 bool SkSpecularLightingImageFilter::asFragmentProcessor(GrFragmentProcessor** fp
      , |  1351 GrFragmentProcessor* SkSpecularLightingImageFilter::getFragmentProcessor( | 
|  1161                                                         GrTexture* texture, |  1352                                                          GrTexture* texture, | 
|  1162                                                         const SkMatrix& matrix, |  1353                                                          const SkMatrix& matrix, | 
|  1163                                                         const SkIRect&) const { |  1354                                                          const SkIRect&, | 
|  1164     if (fp) { |  1355                                                          BoundaryMode boundaryMo
      de) const { | 
|  1165         SkScalar scale = SkScalarMul(surfaceScale(), SkIntToScalar(255)); |  1356     SkScalar scale = SkScalarMul(surfaceScale(), SkIntToScalar(255)); | 
|  1166         *fp = GrSpecularLightingEffect::Create(texture, light(), scale, matrix, 
      ks(), shininess()); |  1357     return GrSpecularLightingEffect::Create(texture, light(), scale, matrix, ks(
      ), shininess(), | 
|  1167     } |  1358                                             boundaryMode); | 
|  1168     return true; |  | 
|  1169 } |  1359 } | 
|  1170 #endif |  1360 #endif | 
|  1171  |  1361  | 
|  1172 /////////////////////////////////////////////////////////////////////////////// |  1362 /////////////////////////////////////////////////////////////////////////////// | 
|  1173  |  1363  | 
|  1174 #if SK_SUPPORT_GPU |  1364 #if SK_SUPPORT_GPU | 
|  1175  |  1365  | 
|  1176 namespace { |  1366 namespace { | 
|  1177 SkPoint3 random_point3(SkRandom* random) { |  1367 SkPoint3 random_point3(SkRandom* random) { | 
|  1178     return SkPoint3(SkScalarToFloat(random->nextSScalar1()), |  1368     return SkPoint3(SkScalarToFloat(random->nextSScalar1()), | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
|  1195                                             random->nextUScalar1(), |  1385                                             random->nextUScalar1(), | 
|  1196                                             random->nextUScalar1(), |  1386                                             random->nextUScalar1(), | 
|  1197                                             random->nextU())); |  1387                                             random->nextU())); | 
|  1198         } |  1388         } | 
|  1199         default: |  1389         default: | 
|  1200             SkFAIL("Unexpected value."); |  1390             SkFAIL("Unexpected value."); | 
|  1201             return NULL; |  1391             return NULL; | 
|  1202     } |  1392     } | 
|  1203 } |  1393 } | 
|  1204  |  1394  | 
 |  1395 SkString emitNormalFunc(BoundaryMode mode, | 
 |  1396                         const char* pointToNormalName, | 
 |  1397                         const char* sobelFuncName) { | 
 |  1398     SkString result; | 
 |  1399     switch (mode) { | 
 |  1400     case kTopLeft_BoundaryMode: | 
 |  1401         result.printf("\treturn %s(%s(0.0, 0.0, m[4], m[5], m[7], m[8], %g),\n" | 
 |  1402                       "\t          %s(0.0, 0.0, m[4], m[7], m[5], m[8], %g),\n" | 
 |  1403                       "\t          surfaceScale);\n", | 
 |  1404                       pointToNormalName, sobelFuncName, gTwoThirds, | 
 |  1405                                          sobelFuncName, gTwoThirds); | 
 |  1406         break; | 
 |  1407     case kTop_BoundaryMode: | 
 |  1408         result.printf("\treturn %s(%s(0.0, 0.0, m[3], m[5], m[6], m[8], %g),\n" | 
 |  1409                       "\t          %s(0.0, 0.0, m[4], m[7], m[5], m[8], %g),\n" | 
 |  1410                       "\t          surfaceScale);\n", | 
 |  1411                       pointToNormalName, sobelFuncName, gOneThird, | 
 |  1412                                          sobelFuncName, gOneHalf); | 
 |  1413         break; | 
 |  1414     case kTopRight_BoundaryMode: | 
 |  1415         result.printf("\treturn %s(%s( 0.0,  0.0, m[3], m[4], m[6], m[7], %g),\n
      " | 
 |  1416                       "\t          %s(m[3], m[6], m[4], m[7],  0.0,  0.0, %g),\n
      " | 
 |  1417                       "\t          surfaceScale);\n", | 
 |  1418                       pointToNormalName, sobelFuncName, gTwoThirds, | 
 |  1419                                          sobelFuncName, gTwoThirds); | 
 |  1420         break; | 
 |  1421     case kLeft_BoundaryMode: | 
 |  1422         result.printf("\treturn %s(%s(m[1], m[2], m[4], m[5], m[7], m[8], %g),\n
      " | 
 |  1423                       "\t          %s( 0.0,  0.0, m[1], m[7], m[2], m[8], %g),\n
      " | 
 |  1424                       "\t          surfaceScale);\n", | 
 |  1425                       pointToNormalName, sobelFuncName, gOneHalf, | 
 |  1426                                          sobelFuncName, gOneThird); | 
 |  1427         break; | 
 |  1428     case kInterior_BoundaryMode: | 
 |  1429         result.printf("\treturn %s(%s(m[0], m[2], m[3], m[5], m[6], m[8], %g),\n
      " | 
 |  1430                       "\t          %s(m[0], m[6], m[1], m[7], m[2], m[8], %g),\n
      " | 
 |  1431                       "\t          surfaceScale);\n", | 
 |  1432                       pointToNormalName, sobelFuncName, gOneQuarter, | 
 |  1433                                          sobelFuncName, gOneQuarter); | 
 |  1434         break; | 
 |  1435     case kRight_BoundaryMode: | 
 |  1436         result.printf("\treturn %s(%s(m[0], m[1], m[3], m[4], m[6], m[7], %g),\n
      " | 
 |  1437                       "\t          %s(m[0], m[6], m[1], m[7],  0.0,  0.0, %g),\n
      " | 
 |  1438                       "\t          surfaceScale);\n", | 
 |  1439                       pointToNormalName, sobelFuncName, gOneHalf, | 
 |  1440                                          sobelFuncName, gOneThird); | 
 |  1441         break; | 
 |  1442     case kBottomLeft_BoundaryMode: | 
 |  1443         result.printf("\treturn %s(%s(m[1], m[2], m[4], m[5],  0.0,  0.0, %g),\n
      " | 
 |  1444                       "\t          %s( 0.0,  0.0, m[1], m[4], m[2], m[5], %g),\n
      " | 
 |  1445                       "\t          surfaceScale);\n", | 
 |  1446                       pointToNormalName, sobelFuncName, gTwoThirds, | 
 |  1447                                          sobelFuncName, gTwoThirds); | 
 |  1448         break; | 
 |  1449     case kBottom_BoundaryMode: | 
 |  1450         result.printf("\treturn %s(%s(m[0], m[2], m[3], m[5],  0.0,  0.0, %g),\n
      " | 
 |  1451                       "\t          %s(m[0], m[3], m[1], m[4], m[2], m[5], %g),\n
      " | 
 |  1452                       "\t          surfaceScale);\n", | 
 |  1453                       pointToNormalName, sobelFuncName, gOneThird, | 
 |  1454                                          sobelFuncName, gOneHalf); | 
 |  1455         break; | 
 |  1456     case kBottomRight_BoundaryMode: | 
 |  1457         result.printf("\treturn %s(%s(m[0], m[1], m[3], m[4],  0.0,  0.0, %g),\n
      " | 
 |  1458                       "\t          %s(m[0], m[3], m[1], m[4],  0.0,  0.0, %g),\n
      " | 
 |  1459                       "\t          surfaceScale);\n", | 
 |  1460                       pointToNormalName, sobelFuncName, gTwoThirds, | 
 |  1461                                          sobelFuncName, gTwoThirds); | 
 |  1462         break; | 
 |  1463     default: | 
 |  1464         SkASSERT(false); | 
 |  1465         break; | 
 |  1466     } | 
 |  1467     return result; | 
 |  1468 } | 
 |  1469  | 
|  1205 } |  1470 } | 
|  1206  |  1471  | 
|  1207 class GrGLLightingEffect  : public GrGLFragmentProcessor { |  1472 class GrGLLightingEffect  : public GrGLFragmentProcessor { | 
|  1208 public: |  1473 public: | 
|  1209     GrGLLightingEffect(const GrProcessor&); |  1474     GrGLLightingEffect(const GrProcessor&); | 
|  1210     virtual ~GrGLLightingEffect(); |  1475     virtual ~GrGLLightingEffect(); | 
|  1211  |  1476  | 
|  1212     virtual void emitCode(GrGLFPBuilder*, |  1477     void emitCode(GrGLFPBuilder*, | 
|  1213                           const GrFragmentProcessor&, |  1478                   const GrFragmentProcessor&, | 
|  1214                           const char* outputColor, |  1479                   const char* outputColor, | 
|  1215                           const char* inputColor, |  1480                   const char* inputColor, | 
|  1216                           const TransformedCoordsArray&, |  1481                   const TransformedCoordsArray&, | 
|  1217                           const TextureSamplerArray&) override; |  1482                   const TextureSamplerArray&) override; | 
|  1218  |  1483  | 
|  1219     static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
      yBuilder* b); |  1484     static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
      yBuilder* b); | 
|  1220  |  1485  | 
|  1221     /** |  1486     /** | 
|  1222      * Subclasses of GrGLLightingEffect must call INHERITED::setData(); |  1487      * Subclasses of GrGLLightingEffect must call INHERITED::setData(); | 
|  1223      */ |  1488      */ | 
|  1224     void setData(const GrGLProgramDataManager&, const GrProcessor&) override; |  1489     void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 
|  1225  |  1490  | 
|  1226 protected: |  1491 protected: | 
|  1227     virtual void emitLightFunc(GrGLFPBuilder*, SkString* funcName) = 0; |  1492     virtual void emitLightFunc(GrGLFPBuilder*, SkString* funcName) = 0; | 
|  1228  |  1493  | 
|  1229 private: |  1494 private: | 
|  1230     typedef GrGLFragmentProcessor INHERITED; |  1495     typedef GrGLFragmentProcessor INHERITED; | 
|  1231  |  1496  | 
|  1232     UniformHandle       fImageIncrementUni; |  1497     UniformHandle       fImageIncrementUni; | 
|  1233     UniformHandle       fSurfaceScaleUni; |  1498     UniformHandle       fSurfaceScaleUni; | 
|  1234     GrGLLight*          fLight; |  1499     GrGLLight*          fLight; | 
 |  1500     BoundaryMode        fBoundaryMode; | 
|  1235 }; |  1501 }; | 
|  1236  |  1502  | 
|  1237 /////////////////////////////////////////////////////////////////////////////// |  1503 /////////////////////////////////////////////////////////////////////////////// | 
|  1238  |  1504  | 
|  1239 class GrGLDiffuseLightingEffect  : public GrGLLightingEffect { |  1505 class GrGLDiffuseLightingEffect  : public GrGLLightingEffect { | 
|  1240 public: |  1506 public: | 
|  1241     GrGLDiffuseLightingEffect(const GrProcessor&); |  1507     GrGLDiffuseLightingEffect(const GrProcessor&); | 
|  1242     void emitLightFunc(GrGLFPBuilder*, SkString* funcName) override; |  1508     void emitLightFunc(GrGLFPBuilder*, SkString* funcName) override; | 
|  1243     void setData(const GrGLProgramDataManager&, const GrProcessor&) override; |  1509     void setData(const GrGLProgramDataManager&, const GrProcessor&) override; | 
|  1244  |  1510  | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
|  1261  |  1527  | 
|  1262     UniformHandle   fKSUni; |  1528     UniformHandle   fKSUni; | 
|  1263     UniformHandle   fShininessUni; |  1529     UniformHandle   fShininessUni; | 
|  1264 }; |  1530 }; | 
|  1265  |  1531  | 
|  1266 /////////////////////////////////////////////////////////////////////////////// |  1532 /////////////////////////////////////////////////////////////////////////////// | 
|  1267  |  1533  | 
|  1268 GrLightingEffect::GrLightingEffect(GrTexture* texture, |  1534 GrLightingEffect::GrLightingEffect(GrTexture* texture, | 
|  1269                                    const SkLight* light, |  1535                                    const SkLight* light, | 
|  1270                                    SkScalar surfaceScale, |  1536                                    SkScalar surfaceScale, | 
|  1271                                    const SkMatrix& matrix) |  1537                                    const SkMatrix& matrix, | 
 |  1538                                    BoundaryMode boundaryMode) | 
|  1272     : INHERITED(texture, GrCoordTransform::MakeDivByTextureWHMatrix(texture)) |  1539     : INHERITED(texture, GrCoordTransform::MakeDivByTextureWHMatrix(texture)) | 
|  1273     , fLight(light) |  1540     , fLight(light) | 
|  1274     , fSurfaceScale(surfaceScale) |  1541     , fSurfaceScale(surfaceScale) | 
|  1275     , fFilterMatrix(matrix) { |  1542     , fFilterMatrix(matrix) | 
 |  1543     , fBoundaryMode(boundaryMode) { | 
|  1276     fLight->ref(); |  1544     fLight->ref(); | 
|  1277     if (light->requiresFragmentPosition()) { |  1545     if (light->requiresFragmentPosition()) { | 
|  1278         this->setWillReadFragmentPosition(); |  1546         this->setWillReadFragmentPosition(); | 
|  1279     } |  1547     } | 
|  1280 } |  1548 } | 
|  1281  |  1549  | 
|  1282 GrLightingEffect::~GrLightingEffect() { |  1550 GrLightingEffect::~GrLightingEffect() { | 
|  1283     fLight->unref(); |  1551     fLight->unref(); | 
|  1284 } |  1552 } | 
|  1285  |  1553  | 
|  1286 bool GrLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const { |  1554 bool GrLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const { | 
|  1287     const GrLightingEffect& s = sBase.cast<GrLightingEffect>(); |  1555     const GrLightingEffect& s = sBase.cast<GrLightingEffect>(); | 
|  1288     return fLight->isEqual(*s.fLight) && |  1556     return fLight->isEqual(*s.fLight) && | 
|  1289            fSurfaceScale == s.fSurfaceScale; |  1557            fSurfaceScale == s.fSurfaceScale && | 
 |  1558            fBoundaryMode == s.fBoundaryMode; | 
|  1290 } |  1559 } | 
|  1291  |  1560  | 
|  1292 /////////////////////////////////////////////////////////////////////////////// |  1561 /////////////////////////////////////////////////////////////////////////////// | 
|  1293  |  1562  | 
|  1294 GrDiffuseLightingEffect::GrDiffuseLightingEffect(GrTexture* texture, |  1563 GrDiffuseLightingEffect::GrDiffuseLightingEffect(GrTexture* texture, | 
|  1295                                                  const SkLight* light, |  1564                                                  const SkLight* light, | 
|  1296                                                  SkScalar surfaceScale, |  1565                                                  SkScalar surfaceScale, | 
|  1297                                                  const SkMatrix& matrix, |  1566                                                  const SkMatrix& matrix, | 
|  1298                                                  SkScalar kd) |  1567                                                  SkScalar kd, | 
|  1299     : INHERITED(texture, light, surfaceScale, matrix), fKD(kd) { |  1568                                                  BoundaryMode boundaryMode) | 
 |  1569     : INHERITED(texture, light, surfaceScale, matrix, boundaryMode), fKD(kd) { | 
|  1300     this->initClassID<GrDiffuseLightingEffect>(); |  1570     this->initClassID<GrDiffuseLightingEffect>(); | 
|  1301 } |  1571 } | 
|  1302  |  1572  | 
|  1303 bool GrDiffuseLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const 
      { |  1573 bool GrDiffuseLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const 
      { | 
|  1304     const GrDiffuseLightingEffect& s = sBase.cast<GrDiffuseLightingEffect>(); |  1574     const GrDiffuseLightingEffect& s = sBase.cast<GrDiffuseLightingEffect>(); | 
|  1305     return INHERITED::onIsEqual(sBase) && |  1575     return INHERITED::onIsEqual(sBase) && | 
|  1306             this->kd() == s.kd(); |  1576             this->kd() == s.kd(); | 
|  1307 } |  1577 } | 
|  1308  |  1578  | 
|  1309 void GrDiffuseLightingEffect::getGLProcessorKey(const GrGLCaps& caps, |  1579 void GrDiffuseLightingEffect::getGLProcessorKey(const GrGLCaps& caps, | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|  1321                                               GrContext* context, |  1591                                               GrContext* context, | 
|  1322                                               const GrDrawTargetCaps&, |  1592                                               const GrDrawTargetCaps&, | 
|  1323                                               GrTexture* textures[]) { |  1593                                               GrTexture* textures[]) { | 
|  1324     SkScalar surfaceScale = random->nextSScalar1(); |  1594     SkScalar surfaceScale = random->nextSScalar1(); | 
|  1325     SkScalar kd = random->nextUScalar1(); |  1595     SkScalar kd = random->nextUScalar1(); | 
|  1326     SkAutoTUnref<SkLight> light(create_random_light(random)); |  1596     SkAutoTUnref<SkLight> light(create_random_light(random)); | 
|  1327     SkMatrix matrix; |  1597     SkMatrix matrix; | 
|  1328     for (int i = 0; i < 9; i++) { |  1598     for (int i = 0; i < 9; i++) { | 
|  1329         matrix[i] = random->nextUScalar1(); |  1599         matrix[i] = random->nextUScalar1(); | 
|  1330     } |  1600     } | 
 |  1601     BoundaryMode mode = static_cast<BoundaryMode>(random->nextU() % kBoundaryMod
      eCount); | 
|  1331     return GrDiffuseLightingEffect::Create(textures[GrProcessorUnitTest::kAlphaT
      extureIdx], |  1602     return GrDiffuseLightingEffect::Create(textures[GrProcessorUnitTest::kAlphaT
      extureIdx], | 
|  1332                                            light, surfaceScale, matrix, kd); |  1603                                            light, surfaceScale, matrix, kd, mode
      ); | 
|  1333 } |  1604 } | 
|  1334  |  1605  | 
|  1335  |  1606  | 
|  1336 /////////////////////////////////////////////////////////////////////////////// |  1607 /////////////////////////////////////////////////////////////////////////////// | 
|  1337  |  1608  | 
|  1338 GrGLLightingEffect::GrGLLightingEffect(const GrProcessor& fp) { |  1609 GrGLLightingEffect::GrGLLightingEffect(const GrProcessor& fp) { | 
|  1339     const GrLightingEffect& m = fp.cast<GrLightingEffect>(); |  1610     const GrLightingEffect& m = fp.cast<GrLightingEffect>(); | 
|  1340     fLight = m.light()->createGLLight(); |  1611     fLight = m.light()->createGLLight(); | 
 |  1612     fBoundaryMode = m.boundaryMode(); | 
|  1341 } |  1613 } | 
|  1342  |  1614  | 
|  1343 GrGLLightingEffect::~GrGLLightingEffect() { |  1615 GrGLLightingEffect::~GrGLLightingEffect() { | 
|  1344     delete fLight; |  1616     delete fLight; | 
|  1345 } |  1617 } | 
|  1346  |  1618  | 
|  1347 void GrGLLightingEffect::emitCode(GrGLFPBuilder* builder, |  1619 void GrGLLightingEffect::emitCode(GrGLFPBuilder* builder, | 
|  1348                                   const GrFragmentProcessor&, |  1620                                   const GrFragmentProcessor&, | 
|  1349                                   const char* outputColor, |  1621                                   const char* outputColor, | 
|  1350                                   const char* inputColor, |  1622                                   const char* inputColor, | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
|  1381     static const GrGLShaderVar gPointToNormalArgs[] =  { |  1653     static const GrGLShaderVar gPointToNormalArgs[] =  { | 
|  1382         GrGLShaderVar("x", kFloat_GrSLType), |  1654         GrGLShaderVar("x", kFloat_GrSLType), | 
|  1383         GrGLShaderVar("y", kFloat_GrSLType), |  1655         GrGLShaderVar("y", kFloat_GrSLType), | 
|  1384         GrGLShaderVar("scale", kFloat_GrSLType), |  1656         GrGLShaderVar("scale", kFloat_GrSLType), | 
|  1385     }; |  1657     }; | 
|  1386     SkString pointToNormalName; |  1658     SkString pointToNormalName; | 
|  1387     fsBuilder->emitFunction(kVec3f_GrSLType, |  1659     fsBuilder->emitFunction(kVec3f_GrSLType, | 
|  1388                             "pointToNormal", |  1660                             "pointToNormal", | 
|  1389                             SK_ARRAY_COUNT(gPointToNormalArgs), |  1661                             SK_ARRAY_COUNT(gPointToNormalArgs), | 
|  1390                             gPointToNormalArgs, |  1662                             gPointToNormalArgs, | 
|  1391                             "\treturn normalize(vec3(-x * scale, y * scale, 1));
      \n", |  1663                             "\treturn normalize(vec3(-x * scale, -y * scale, 1))
      ;\n", | 
|  1392                             &pointToNormalName); |  1664                             &pointToNormalName); | 
|  1393  |  1665  | 
|  1394     static const GrGLShaderVar gInteriorNormalArgs[] =  { |  1666     static const GrGLShaderVar gInteriorNormalArgs[] =  { | 
|  1395         GrGLShaderVar("m", kFloat_GrSLType, 9), |  1667         GrGLShaderVar("m", kFloat_GrSLType, 9), | 
|  1396         GrGLShaderVar("surfaceScale", kFloat_GrSLType), |  1668         GrGLShaderVar("surfaceScale", kFloat_GrSLType), | 
|  1397     }; |  1669     }; | 
|  1398     SkString interiorNormalBody; |  1670     SkString normalBody = emitNormalFunc(fBoundaryMode, | 
|  1399     interiorNormalBody.appendf("\treturn %s(%s(m[0], m[2], m[3], m[5], m[6], m[8
      ], 0.25),\n" |  1671                                          pointToNormalName.c_str(), | 
|  1400                                "\t       %s(m[0], m[6], m[1], m[7], m[2], m[8], 
      0.25),\n" |  1672                                          sobelFuncName.c_str()); | 
|  1401                                "\t       surfaceScale);\n", |  1673     SkString normalName; | 
|  1402                                 pointToNormalName.c_str(), |  | 
|  1403                                 sobelFuncName.c_str(), |  | 
|  1404                                 sobelFuncName.c_str()); |  | 
|  1405     SkString interiorNormalName; |  | 
|  1406     fsBuilder->emitFunction(kVec3f_GrSLType, |  1674     fsBuilder->emitFunction(kVec3f_GrSLType, | 
|  1407                             "interiorNormal", |  1675                             "normal", | 
|  1408                             SK_ARRAY_COUNT(gInteriorNormalArgs), |  1676                             SK_ARRAY_COUNT(gInteriorNormalArgs), | 
|  1409                             gInteriorNormalArgs, |  1677                             gInteriorNormalArgs, | 
|  1410                             interiorNormalBody.c_str(), |  1678                             normalBody.c_str(), | 
|  1411                             &interiorNormalName); |  1679                             &normalName); | 
|  1412  |  1680  | 
|  1413     fsBuilder->codeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str()); |  1681     fsBuilder->codeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str()); | 
|  1414     fsBuilder->codeAppend("\t\tfloat m[9];\n"); |  1682     fsBuilder->codeAppend("\t\tfloat m[9];\n"); | 
|  1415  |  1683  | 
|  1416     const char* imgInc = builder->getUniformCStr(fImageIncrementUni); |  1684     const char* imgInc = builder->getUniformCStr(fImageIncrementUni); | 
|  1417     const char* surfScale = builder->getUniformCStr(fSurfaceScaleUni); |  1685     const char* surfScale = builder->getUniformCStr(fSurfaceScaleUni); | 
|  1418  |  1686  | 
|  1419     int index = 0; |  1687     int index = 0; | 
|  1420     for (int dy = -1; dy <= 1; dy++) { |  1688     for (int dy = 1; dy >= -1; dy--) { | 
|  1421         for (int dx = -1; dx <= 1; dx++) { |  1689         for (int dx = -1; dx <= 1; dx++) { | 
|  1422             SkString texCoords; |  1690             SkString texCoords; | 
|  1423             texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); |  1691             texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); | 
|  1424             fsBuilder->codeAppendf("\t\tm[%d] = ", index++); |  1692             fsBuilder->codeAppendf("\t\tm[%d] = ", index++); | 
|  1425             fsBuilder->appendTextureLookup(samplers[0], texCoords.c_str()); |  1693             fsBuilder->appendTextureLookup(samplers[0], texCoords.c_str()); | 
|  1426             fsBuilder->codeAppend(".a;\n"); |  1694             fsBuilder->codeAppend(".a;\n"); | 
|  1427         } |  1695         } | 
|  1428     } |  1696     } | 
|  1429     fsBuilder->codeAppend("\t\tvec3 surfaceToLight = "); |  1697     fsBuilder->codeAppend("\t\tvec3 surfaceToLight = "); | 
|  1430     SkString arg; |  1698     SkString arg; | 
|  1431     arg.appendf("%s * m[4]", surfScale); |  1699     arg.appendf("%s * m[4]", surfScale); | 
|  1432     fLight->emitSurfaceToLight(builder, arg.c_str()); |  1700     fLight->emitSurfaceToLight(builder, arg.c_str()); | 
|  1433     fsBuilder->codeAppend(";\n"); |  1701     fsBuilder->codeAppend(";\n"); | 
|  1434     fsBuilder->codeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ", |  1702     fsBuilder->codeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ", | 
|  1435                            outputColor, lightFunc.c_str(), interiorNormalName.c_
      str(), surfScale); |  1703                            outputColor, lightFunc.c_str(), normalName.c_str(), s
      urfScale); | 
|  1436     fLight->emitLightColor(builder, "surfaceToLight"); |  1704     fLight->emitLightColor(builder, "surfaceToLight"); | 
|  1437     fsBuilder->codeAppend(");\n"); |  1705     fsBuilder->codeAppend(");\n"); | 
|  1438     SkString modulate; |  1706     SkString modulate; | 
|  1439     GrGLSLMulVarBy4f(&modulate, outputColor, inputColor); |  1707     GrGLSLMulVarBy4f(&modulate, outputColor, inputColor); | 
|  1440     fsBuilder->codeAppend(modulate.c_str()); |  1708     fsBuilder->codeAppend(modulate.c_str()); | 
|  1441 } |  1709 } | 
|  1442  |  1710  | 
|  1443 void GrGLLightingEffect::GenKey(const GrProcessor& proc, |  1711 void GrGLLightingEffect::GenKey(const GrProcessor& proc, | 
|  1444                                 const GrGLCaps& caps, GrProcessorKeyBuilder* b) 
      { |  1712                                 const GrGLCaps& caps, GrProcessorKeyBuilder* b) 
      { | 
|  1445     b->add32(proc.cast<GrLightingEffect>().light()->type()); |  1713     const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); | 
 |  1714     b->add32(lighting.boundaryMode() << 2 | lighting.light()->type()); | 
|  1446 } |  1715 } | 
|  1447  |  1716  | 
|  1448 void GrGLLightingEffect::setData(const GrGLProgramDataManager& pdman, |  1717 void GrGLLightingEffect::setData(const GrGLProgramDataManager& pdman, | 
|  1449                                  const GrProcessor& proc) { |  1718                                  const GrProcessor& proc) { | 
|  1450     const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); |  1719     const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); | 
|  1451     GrTexture* texture = lighting.texture(0); |  1720     GrTexture* texture = lighting.texture(0); | 
|  1452     float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; |  1721     float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; | 
|  1453     pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->he
      ight()); |  1722     pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->he
      ight()); | 
|  1454     pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); |  1723     pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); | 
|  1455     SkAutoTUnref<SkLight> transformedLight(lighting.light()->transform(lighting.
      filterMatrix())); |  1724     SkAutoTUnref<SkLight> transformedLight(lighting.light()->transform(lighting.
      filterMatrix())); | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1493     pdman.set1f(fKDUni, diffuse.kd()); |  1762     pdman.set1f(fKDUni, diffuse.kd()); | 
|  1494 } |  1763 } | 
|  1495  |  1764  | 
|  1496 /////////////////////////////////////////////////////////////////////////////// |  1765 /////////////////////////////////////////////////////////////////////////////// | 
|  1497  |  1766  | 
|  1498 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, |  1767 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, | 
|  1499                                                    const SkLight* light, |  1768                                                    const SkLight* light, | 
|  1500                                                    SkScalar surfaceScale, |  1769                                                    SkScalar surfaceScale, | 
|  1501                                                    const SkMatrix& matrix, |  1770                                                    const SkMatrix& matrix, | 
|  1502                                                    SkScalar ks, |  1771                                                    SkScalar ks, | 
|  1503                                                    SkScalar shininess) |  1772                                                    SkScalar shininess, | 
|  1504     : INHERITED(texture, light, surfaceScale, matrix), |  1773                                                    BoundaryMode boundaryMode) | 
 |  1774     : INHERITED(texture, light, surfaceScale, matrix, boundaryMode), | 
|  1505       fKS(ks), |  1775       fKS(ks), | 
|  1506       fShininess(shininess) { |  1776       fShininess(shininess) { | 
|  1507     this->initClassID<GrSpecularLightingEffect>(); |  1777     this->initClassID<GrSpecularLightingEffect>(); | 
|  1508 } |  1778 } | 
|  1509  |  1779  | 
|  1510 bool GrSpecularLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const
       { |  1780 bool GrSpecularLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const
       { | 
|  1511     const GrSpecularLightingEffect& s = sBase.cast<GrSpecularLightingEffect>(); |  1781     const GrSpecularLightingEffect& s = sBase.cast<GrSpecularLightingEffect>(); | 
|  1512     return INHERITED::onIsEqual(sBase) && |  1782     return INHERITED::onIsEqual(sBase) && | 
|  1513            this->ks() == s.ks() && |  1783            this->ks() == s.ks() && | 
|  1514            this->shininess() == s.shininess(); |  1784            this->shininess() == s.shininess(); | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
|  1530                                                           const GrDrawTargetCaps
      &, |  1800                                                           const GrDrawTargetCaps
      &, | 
|  1531                                                           GrTexture* textures[])
       { |  1801                                                           GrTexture* textures[])
       { | 
|  1532     SkScalar surfaceScale = random->nextSScalar1(); |  1802     SkScalar surfaceScale = random->nextSScalar1(); | 
|  1533     SkScalar ks = random->nextUScalar1(); |  1803     SkScalar ks = random->nextUScalar1(); | 
|  1534     SkScalar shininess = random->nextUScalar1(); |  1804     SkScalar shininess = random->nextUScalar1(); | 
|  1535     SkAutoTUnref<SkLight> light(create_random_light(random)); |  1805     SkAutoTUnref<SkLight> light(create_random_light(random)); | 
|  1536     SkMatrix matrix; |  1806     SkMatrix matrix; | 
|  1537     for (int i = 0; i < 9; i++) { |  1807     for (int i = 0; i < 9; i++) { | 
|  1538         matrix[i] = random->nextUScalar1(); |  1808         matrix[i] = random->nextUScalar1(); | 
|  1539     } |  1809     } | 
 |  1810     BoundaryMode mode = static_cast<BoundaryMode>(random->nextU() % kBoundaryMod
      eCount); | 
|  1540     return GrSpecularLightingEffect::Create(textures[GrProcessorUnitTest::kAlpha
      TextureIdx], |  1811     return GrSpecularLightingEffect::Create(textures[GrProcessorUnitTest::kAlpha
      TextureIdx], | 
|  1541                                             light, surfaceScale, matrix, ks, shi
      niness); |  1812                                             light, surfaceScale, matrix, ks, shi
      niness, mode); | 
|  1542 } |  1813 } | 
|  1543  |  1814  | 
|  1544 /////////////////////////////////////////////////////////////////////////////// |  1815 /////////////////////////////////////////////////////////////////////////////// | 
|  1545  |  1816  | 
|  1546 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrProcessor& proc) |  1817 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrProcessor& proc) | 
|  1547     : INHERITED(proc) { |  1818     : INHERITED(proc) { | 
|  1548 } |  1819 } | 
|  1549  |  1820  | 
|  1550 void GrGLSpecularLightingEffect::emitLightFunc(GrGLFPBuilder* builder, SkString*
       funcName) { |  1821 void GrGLSpecularLightingEffect::emitLightFunc(GrGLFPBuilder* builder, SkString*
       funcName) { | 
|  1551     const char* ks; |  1822     const char* ks; | 
|  1552     const char* shininess; |  1823     const char* shininess; | 
|  1553  |  1824  | 
|  1554     fKSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |  1825     fKSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 
|  1555                                  kFloat_GrSLType, kDefault_GrSLPrecision, "KS", 
      &ks); |  1826                                  kFloat_GrSLType, kDefault_GrSLPrecision, "KS", 
      &ks); | 
|  1556     fShininessUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
      , |  1827     fShininessUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
      , | 
|  1557                                         kFloat_GrSLType, kDefault_GrSLPrecision,
       "Shininess", &shininess); |  1828                                         kFloat_GrSLType, | 
 |  1829                                         kDefault_GrSLPrecision, | 
 |  1830                                         "Shininess", | 
 |  1831                                         &shininess); | 
|  1558  |  1832  | 
|  1559     static const GrGLShaderVar gLightArgs[] = { |  1833     static const GrGLShaderVar gLightArgs[] = { | 
|  1560         GrGLShaderVar("normal", kVec3f_GrSLType), |  1834         GrGLShaderVar("normal", kVec3f_GrSLType), | 
|  1561         GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), |  1835         GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), | 
|  1562         GrGLShaderVar("lightColor", kVec3f_GrSLType) |  1836         GrGLShaderVar("lightColor", kVec3f_GrSLType) | 
|  1563     }; |  1837     }; | 
|  1564     SkString lightBody; |  1838     SkString lightBody; | 
|  1565     lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0, 
      0, 1)));\n"); |  1839     lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0, 
      0, 1)));\n"); | 
|  1566     lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\
      n", ks, shininess); |  1840     lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\
      n", ks, shininess); | 
|  1567     lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
      n"); |  1841     lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
      n"); | 
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1712  |  1986  | 
|  1713     fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |  1987     fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 
|  1714 } |  1988 } | 
|  1715  |  1989  | 
|  1716 #endif |  1990 #endif | 
|  1717  |  1991  | 
|  1718 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |  1992 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 
|  1719     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |  1993     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 
|  1720     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |  1994     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 
|  1721 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |  1995 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 
| OLD | NEW |