Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(209)

Side by Side Diff: src/effects/SkLightingImageFilter.cpp

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

Powered by Google App Engine
This is Rietveld 408576698