| 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" |
| 11 #include "SkDevice.h" | 11 #include "SkDevice.h" |
| 12 #include "SkPoint3.h" | 12 #include "SkPoint3.h" |
| 13 #include "SkReadBuffer.h" | 13 #include "SkReadBuffer.h" |
| 14 #include "SkTypes.h" | 14 #include "SkTypes.h" |
| 15 #include "SkWriteBuffer.h" | 15 #include "SkWriteBuffer.h" |
| 16 | 16 |
| 17 #if SK_SUPPORT_GPU | 17 #if SK_SUPPORT_GPU |
| 18 #include "GrContext.h" | 18 #include "GrContext.h" |
| 19 #include "GrDrawContext.h" | 19 #include "GrDrawContext.h" |
| 20 #include "GrFragmentProcessor.h" | 20 #include "GrFragmentProcessor.h" |
| 21 #include "GrInvariantOutput.h" | 21 #include "GrInvariantOutput.h" |
| 22 #include "GrPaint.h" | 22 #include "GrPaint.h" |
| 23 #include "SkGr.h" | 23 #include "SkGr.h" |
| 24 #include "effects/GrSingleTextureEffect.h" | 24 #include "effects/GrSingleTextureEffect.h" |
| 25 #include "effects/GrTextureDomain.h" |
| 25 #include "glsl/GrGLSLFragmentProcessor.h" | 26 #include "glsl/GrGLSLFragmentProcessor.h" |
| 26 #include "glsl/GrGLSLFragmentShaderBuilder.h" | 27 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
| 27 #include "glsl/GrGLSLProgramDataManager.h" | 28 #include "glsl/GrGLSLProgramDataManager.h" |
| 28 #include "glsl/GrGLSLUniformHandler.h" | 29 #include "glsl/GrGLSLUniformHandler.h" |
| 29 | 30 |
| 30 class GrGLDiffuseLightingEffect; | 31 class GrGLDiffuseLightingEffect; |
| 31 class GrGLSpecularLightingEffect; | 32 class GrGLSpecularLightingEffect; |
| 32 | 33 |
| 33 // For brevity | 34 // For brevity |
| 34 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; | 35 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 SkImageFilter* input, | 352 SkImageFilter* input, |
| 352 const CropRect* cropRect) | 353 const CropRect* cropRect) |
| 353 : INHERITED(light, surfaceScale, input, cropRect) {} | 354 : INHERITED(light, surfaceScale, input, cropRect) {} |
| 354 | 355 |
| 355 #if SK_SUPPORT_GPU | 356 #if SK_SUPPORT_GPU |
| 356 bool canFilterImageGPU() const override { return true; } | 357 bool canFilterImageGPU() const override { return true; } |
| 357 bool filterImageGPU(Proxy*, const SkBitmap& src, const Context&, | 358 bool filterImageGPU(Proxy*, const SkBitmap& src, const Context&, |
| 358 SkBitmap* result, SkIPoint* offset) const override; | 359 SkBitmap* result, SkIPoint* offset) const override; |
| 359 virtual GrFragmentProcessor* getFragmentProcessor(GrTexture*, | 360 virtual GrFragmentProcessor* getFragmentProcessor(GrTexture*, |
| 360 const SkMatrix&, | 361 const SkMatrix&, |
| 361 const SkIRect& bounds, | 362 const SkIRect* srcBounds, |
| 362 BoundaryMode boundaryMode)
const = 0; | 363 BoundaryMode boundaryMode)
const = 0; |
| 363 #endif | 364 #endif |
| 364 private: | 365 private: |
| 365 #if SK_SUPPORT_GPU | 366 #if SK_SUPPORT_GPU |
| 366 void drawRect(GrDrawContext* drawContext, | 367 void drawRect(GrDrawContext* drawContext, |
| 367 GrTexture* src, | 368 GrTexture* src, |
| 368 const SkMatrix& matrix, | 369 const SkMatrix& matrix, |
| 369 const GrClip& clip, | 370 const GrClip& clip, |
| 370 const SkRect& dstRect, | 371 const SkRect& dstRect, |
| 371 BoundaryMode boundaryMode, | 372 BoundaryMode boundaryMode, |
| 373 const SkIRect* srcBounds, |
| 372 const SkIRect& bounds) const; | 374 const SkIRect& bounds) const; |
| 373 #endif | 375 #endif |
| 374 typedef SkLightingImageFilter INHERITED; | 376 typedef SkLightingImageFilter INHERITED; |
| 375 }; | 377 }; |
| 376 | 378 |
| 377 #if SK_SUPPORT_GPU | 379 #if SK_SUPPORT_GPU |
| 378 void SkLightingImageFilterInternal::drawRect(GrDrawContext* drawContext, | 380 void SkLightingImageFilterInternal::drawRect(GrDrawContext* drawContext, |
| 379 GrTexture* src, | 381 GrTexture* src, |
| 380 const SkMatrix& matrix, | 382 const SkMatrix& matrix, |
| 381 const GrClip& clip, | 383 const GrClip& clip, |
| 382 const SkRect& dstRect, | 384 const SkRect& dstRect, |
| 383 BoundaryMode boundaryMode, | 385 BoundaryMode boundaryMode, |
| 386 const SkIRect* srcBounds, |
| 384 const SkIRect& bounds) const { | 387 const SkIRect& bounds) const { |
| 385 SkRect srcRect = dstRect.makeOffset(SkIntToScalar(bounds.x()), SkIntToScalar
(bounds.y())); | 388 SkRect srcRect = dstRect.makeOffset(SkIntToScalar(bounds.x()), SkIntToScalar
(bounds.y())); |
| 386 GrPaint paint; | 389 GrPaint paint; |
| 387 GrFragmentProcessor* fp = this->getFragmentProcessor(src, matrix, bounds, bo
undaryMode); | 390 GrFragmentProcessor* fp = this->getFragmentProcessor(src, matrix, srcBounds,
boundaryMode); |
| 388 paint.addColorFragmentProcessor(fp)->unref(); | 391 paint.addColorFragmentProcessor(fp)->unref(); |
| 389 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); | 392 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); |
| 390 drawContext->fillRectToRect(clip, paint, SkMatrix::I(), dstRect, srcRect); | 393 drawContext->fillRectToRect(clip, paint, SkMatrix::I(), dstRect, srcRect); |
| 391 } | 394 } |
| 392 | 395 |
| 393 bool SkLightingImageFilterInternal::filterImageGPU(Proxy* proxy, | 396 bool SkLightingImageFilterInternal::filterImageGPU(Proxy* proxy, |
| 394 const SkBitmap& src, | 397 const SkBitmap& src, |
| 395 const Context& ctx, | 398 const Context& ctx, |
| 396 SkBitmap* result, | 399 SkBitmap* result, |
| 397 SkIPoint* offset) const { | 400 SkIPoint* offset) const { |
| 398 SkBitmap input = src; | 401 SkBitmap input = src; |
| 399 SkIPoint srcOffset = SkIPoint::Make(0, 0); | 402 SkIPoint srcOffset = SkIPoint::Make(0, 0); |
| 400 if (!this->filterInputGPU(0, proxy, src, ctx, &input, &srcOffset)) { | 403 if (!this->filterInputGPU(0, proxy, src, ctx, &input, &srcOffset)) { |
| 401 return false; | 404 return false; |
| 402 } | 405 } |
| 406 SkIRect srcBounds = input.bounds(); |
| 407 srcBounds.offset(srcOffset); |
| 403 SkIRect bounds; | 408 SkIRect bounds; |
| 404 if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &bounds, &input)) { | 409 if (!this->applyCropRect(ctx, srcBounds, &bounds)) { |
| 405 return false; | 410 return false; |
| 406 } | 411 } |
| 407 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(bounds.width()), | 412 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(bounds.width()), |
| 408 SkIntToScalar(bounds.height())); | 413 SkIntToScalar(bounds.height())); |
| 409 GrTexture* srcTexture = input.getTexture(); | 414 GrTexture* srcTexture = input.getTexture(); |
| 410 GrContext* context = srcTexture->getContext(); | 415 GrContext* context = srcTexture->getContext(); |
| 411 | 416 |
| 412 GrSurfaceDesc desc; | 417 GrSurfaceDesc desc; |
| 413 desc.fFlags = kRenderTarget_GrSurfaceFlag, | 418 desc.fFlags = kRenderTarget_GrSurfaceFlag, |
| 414 desc.fWidth = bounds.width(); | 419 desc.fWidth = bounds.width(); |
| 415 desc.fHeight = bounds.height(); | 420 desc.fHeight = bounds.height(); |
| 416 desc.fConfig = kRGBA_8888_GrPixelConfig; | 421 desc.fConfig = kRGBA_8888_GrPixelConfig; |
| 417 | 422 |
| 418 SkAutoTUnref<GrTexture> dst(context->textureProvider()->createApproxTexture(
desc)); | 423 SkAutoTUnref<GrTexture> dst(context->textureProvider()->createApproxTexture(
desc)); |
| 419 if (!dst) { | 424 if (!dst) { |
| 420 return false; | 425 return false; |
| 421 } | 426 } |
| 422 | 427 |
| 423 // setup new clip | 428 // setup new clip |
| 424 GrClip clip(dstRect); | 429 GrClip clip(dstRect); |
| 425 | 430 |
| 426 offset->fX = bounds.left(); | 431 offset->fX = bounds.left(); |
| 427 offset->fY = bounds.top(); | 432 offset->fY = bounds.top(); |
| 428 SkMatrix matrix(ctx.ctm()); | 433 SkMatrix matrix(ctx.ctm()); |
| 429 matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.to
p())); | 434 matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.to
p())); |
| 430 bounds.offset(-srcOffset); | 435 bounds.offset(-srcOffset); |
| 436 srcBounds.offset(-srcOffset); |
| 431 SkRect topLeft = SkRect::MakeXYWH(0, 0, 1, 1); | 437 SkRect topLeft = SkRect::MakeXYWH(0, 0, 1, 1); |
| 432 SkRect top = SkRect::MakeXYWH(1, 0, dstRect.width() - 2, 1); | 438 SkRect top = SkRect::MakeXYWH(1, 0, dstRect.width() - 2, 1); |
| 433 SkRect topRight = SkRect::MakeXYWH(dstRect.width() - 1, 0, 1, 1); | 439 SkRect topRight = SkRect::MakeXYWH(dstRect.width() - 1, 0, 1, 1); |
| 434 SkRect left = SkRect::MakeXYWH(0, 1, 1, dstRect.height() - 2); | 440 SkRect left = SkRect::MakeXYWH(0, 1, 1, dstRect.height() - 2); |
| 435 SkRect interior = dstRect.makeInset(1, 1); | 441 SkRect interior = dstRect.makeInset(1, 1); |
| 436 SkRect right = SkRect::MakeXYWH(dstRect.width() - 1, 1, 1, dstRect.height()
- 2); | 442 SkRect right = SkRect::MakeXYWH(dstRect.width() - 1, 1, 1, dstRect.height()
- 2); |
| 437 SkRect bottomLeft = SkRect::MakeXYWH(0, dstRect.height() - 1, 1, 1); | 443 SkRect bottomLeft = SkRect::MakeXYWH(0, dstRect.height() - 1, 1, 1); |
| 438 SkRect bottom = SkRect::MakeXYWH(1, dstRect.height() - 1, dstRect.width() -
2, 1); | 444 SkRect bottom = SkRect::MakeXYWH(1, dstRect.height() - 1, dstRect.width() -
2, 1); |
| 439 SkRect bottomRight = SkRect::MakeXYWH(dstRect.width() - 1, dstRect.height()
- 1, 1, 1); | 445 SkRect bottomRight = SkRect::MakeXYWH(dstRect.width() - 1, dstRect.height()
- 1, 1, 1); |
| 440 | 446 |
| 441 SkAutoTUnref<GrDrawContext> drawContext(context->drawContext(dst->asRenderTa
rget())); | 447 SkAutoTUnref<GrDrawContext> drawContext(context->drawContext(dst->asRenderTa
rget())); |
| 442 if (!drawContext) { | 448 if (!drawContext) { |
| 443 return false; | 449 return false; |
| 444 } | 450 } |
| 445 | 451 |
| 446 this->drawRect(drawContext, srcTexture, matrix, clip, topLeft, kTopLeft_Boun
daryMode, bounds); | 452 const SkIRect* pSrcBounds = srcBounds.contains(bounds) ? nullptr : &srcBound
s; |
| 447 this->drawRect(drawContext, srcTexture, matrix, clip, top, kTop_BoundaryMode
, bounds); | 453 this->drawRect(drawContext, srcTexture, matrix, clip, topLeft, kTopLeft_Boun
daryMode, |
| 454 pSrcBounds, bounds); |
| 455 this->drawRect(drawContext, srcTexture, matrix, clip, top, kTop_BoundaryMode
, |
| 456 pSrcBounds, bounds); |
| 448 this->drawRect(drawContext, srcTexture, matrix, clip, topRight, kTopRight_Bo
undaryMode, | 457 this->drawRect(drawContext, srcTexture, matrix, clip, topRight, kTopRight_Bo
undaryMode, |
| 449 bounds); | 458 pSrcBounds, bounds); |
| 450 this->drawRect(drawContext, srcTexture, matrix, clip, left, kLeft_BoundaryMo
de, bounds); | 459 this->drawRect(drawContext, srcTexture, matrix, clip, left, kLeft_BoundaryMo
de, |
| 460 pSrcBounds, bounds); |
| 451 this->drawRect(drawContext, srcTexture, matrix, clip, interior, kInterior_Bo
undaryMode, | 461 this->drawRect(drawContext, srcTexture, matrix, clip, interior, kInterior_Bo
undaryMode, |
| 452 bounds); | 462 pSrcBounds, bounds); |
| 453 this->drawRect(drawContext, srcTexture, matrix, clip, right, kRight_Boundary
Mode, bounds); | 463 this->drawRect(drawContext, srcTexture, matrix, clip, right, kRight_Boundary
Mode, |
| 464 pSrcBounds, bounds); |
| 454 this->drawRect(drawContext, srcTexture, matrix, clip, bottomLeft, kBottomLef
t_BoundaryMode, | 465 this->drawRect(drawContext, srcTexture, matrix, clip, bottomLeft, kBottomLef
t_BoundaryMode, |
| 455 bounds); | 466 pSrcBounds, bounds); |
| 456 this->drawRect(drawContext, srcTexture, matrix, clip, bottom, kBottom_Bounda
ryMode, bounds); | 467 this->drawRect(drawContext, srcTexture, matrix, clip, bottom, kBottom_Bounda
ryMode, |
| 468 pSrcBounds, bounds); |
| 457 this->drawRect(drawContext, srcTexture, matrix, clip, bottomRight, | 469 this->drawRect(drawContext, srcTexture, matrix, clip, bottomRight, |
| 458 kBottomRight_BoundaryMode, bounds); | 470 kBottomRight_BoundaryMode, pSrcBounds, bounds); |
| 459 GrWrapTextureInBitmap(dst, bounds.width(), bounds.height(), false, result); | 471 GrWrapTextureInBitmap(dst, bounds.width(), bounds.height(), false, result); |
| 460 return true; | 472 return true; |
| 461 } | 473 } |
| 462 #endif | 474 #endif |
| 463 | 475 |
| 464 class SkDiffuseLightingImageFilter : public SkLightingImageFilterInternal { | 476 class SkDiffuseLightingImageFilter : public SkLightingImageFilterInternal { |
| 465 public: | 477 public: |
| 466 static SkImageFilter* Create(SkImageFilterLight* light, SkScalar surfaceScal
e, | 478 static SkImageFilter* Create(SkImageFilterLight* light, SkScalar surfaceScal
e, |
| 467 SkScalar kd, SkImageFilter*, | 479 SkScalar kd, SkImageFilter*, |
| 468 const CropRect*); | 480 const CropRect*); |
| 469 | 481 |
| 470 SK_TO_STRING_OVERRIDE() | 482 SK_TO_STRING_OVERRIDE() |
| 471 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDiffuseLightingImageFi
lter) | 483 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDiffuseLightingImageFi
lter) |
| 472 SkScalar kd() const { return fKD; } | 484 SkScalar kd() const { return fKD; } |
| 473 | 485 |
| 474 protected: | 486 protected: |
| 475 SkDiffuseLightingImageFilter(SkImageFilterLight* light, SkScalar surfaceScal
e, | 487 SkDiffuseLightingImageFilter(SkImageFilterLight* light, SkScalar surfaceScal
e, |
| 476 SkScalar kd, SkImageFilter* input, const CropRe
ct* cropRect); | 488 SkScalar kd, SkImageFilter* input, const CropRe
ct* cropRect); |
| 477 void flatten(SkWriteBuffer& buffer) const override; | 489 void flatten(SkWriteBuffer& buffer) const override; |
| 478 bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, | 490 bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, |
| 479 SkBitmap* result, SkIPoint* offset) const override; | 491 SkBitmap* result, SkIPoint* offset) const override; |
| 480 #if SK_SUPPORT_GPU | 492 #if SK_SUPPORT_GPU |
| 481 GrFragmentProcessor* getFragmentProcessor(GrTexture*, const SkMatrix&, const
SkIRect& bounds, | 493 GrFragmentProcessor* getFragmentProcessor(GrTexture*, const SkMatrix&, const
SkIRect* bounds, |
| 482 BoundaryMode) const override; | 494 BoundaryMode) const override; |
| 483 #endif | 495 #endif |
| 484 | 496 |
| 485 private: | 497 private: |
| 486 friend class SkLightingImageFilter; | 498 friend class SkLightingImageFilter; |
| 487 typedef SkLightingImageFilterInternal INHERITED; | 499 typedef SkLightingImageFilterInternal INHERITED; |
| 488 SkScalar fKD; | 500 SkScalar fKD; |
| 489 }; | 501 }; |
| 490 | 502 |
| 491 class SkSpecularLightingImageFilter : public SkLightingImageFilterInternal { | 503 class SkSpecularLightingImageFilter : public SkLightingImageFilterInternal { |
| 492 public: | 504 public: |
| 493 static SkImageFilter* Create(SkImageFilterLight* light, SkScalar surfaceScal
e, | 505 static SkImageFilter* Create(SkImageFilterLight* light, SkScalar surfaceScal
e, |
| 494 SkScalar ks, SkScalar shininess, SkImageFilter*
, const CropRect*); | 506 SkScalar ks, SkScalar shininess, SkImageFilter*
, const CropRect*); |
| 495 | 507 |
| 496 SK_TO_STRING_OVERRIDE() | 508 SK_TO_STRING_OVERRIDE() |
| 497 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpecularLightingImageF
ilter) | 509 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpecularLightingImageF
ilter) |
| 498 | 510 |
| 499 SkScalar ks() const { return fKS; } | 511 SkScalar ks() const { return fKS; } |
| 500 SkScalar shininess() const { return fShininess; } | 512 SkScalar shininess() const { return fShininess; } |
| 501 | 513 |
| 502 protected: | 514 protected: |
| 503 SkSpecularLightingImageFilter(SkImageFilterLight* light, SkScalar surfaceSca
le, SkScalar ks, | 515 SkSpecularLightingImageFilter(SkImageFilterLight* light, SkScalar surfaceSca
le, SkScalar ks, |
| 504 SkScalar shininess, SkImageFilter* input, cons
t CropRect*); | 516 SkScalar shininess, SkImageFilter* input, cons
t CropRect*); |
| 505 void flatten(SkWriteBuffer& buffer) const override; | 517 void flatten(SkWriteBuffer& buffer) const override; |
| 506 bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, | 518 bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, |
| 507 SkBitmap* result, SkIPoint* offset) const override; | 519 SkBitmap* result, SkIPoint* offset) const override; |
| 508 #if SK_SUPPORT_GPU | 520 #if SK_SUPPORT_GPU |
| 509 GrFragmentProcessor* getFragmentProcessor(GrTexture*, const SkMatrix&, const
SkIRect& bounds, | 521 GrFragmentProcessor* getFragmentProcessor(GrTexture*, const SkMatrix&, const
SkIRect* bounds, |
| 510 BoundaryMode) const override; | 522 BoundaryMode) const override; |
| 511 #endif | 523 #endif |
| 512 | 524 |
| 513 private: | 525 private: |
| 514 SkScalar fKS; | 526 SkScalar fKS; |
| 515 SkScalar fShininess; | 527 SkScalar fShininess; |
| 516 friend class SkLightingImageFilter; | 528 friend class SkLightingImageFilter; |
| 517 typedef SkLightingImageFilterInternal INHERITED; | 529 typedef SkLightingImageFilterInternal INHERITED; |
| 518 }; | 530 }; |
| 519 | 531 |
| 520 #if SK_SUPPORT_GPU | 532 #if SK_SUPPORT_GPU |
| 521 | 533 |
| 522 class GrLightingEffect : public GrSingleTextureEffect { | 534 class GrLightingEffect : public GrSingleTextureEffect { |
| 523 public: | 535 public: |
| 524 GrLightingEffect(GrTexture* texture, const SkImageFilterLight* light, SkScal
ar surfaceScale, | 536 GrLightingEffect(GrTexture* texture, const SkImageFilterLight* light, SkScal
ar surfaceScale, |
| 525 const SkMatrix& matrix, BoundaryMode boundaryMode); | 537 const SkMatrix& matrix, BoundaryMode boundaryMode, const Sk
IRect* srcBounds); |
| 526 ~GrLightingEffect() override; | 538 ~GrLightingEffect() override; |
| 527 | 539 |
| 528 const SkImageFilterLight* light() const { return fLight; } | 540 const SkImageFilterLight* light() const { return fLight; } |
| 529 SkScalar surfaceScale() const { return fSurfaceScale; } | 541 SkScalar surfaceScale() const { return fSurfaceScale; } |
| 530 const SkMatrix& filterMatrix() const { return fFilterMatrix; } | 542 const SkMatrix& filterMatrix() const { return fFilterMatrix; } |
| 531 BoundaryMode boundaryMode() const { return fBoundaryMode; } | 543 BoundaryMode boundaryMode() const { return fBoundaryMode; } |
| 544 const GrTextureDomain& domain() const { return fDomain; } |
| 532 | 545 |
| 533 protected: | 546 protected: |
| 534 bool onIsEqual(const GrFragmentProcessor&) const override; | 547 bool onIsEqual(const GrFragmentProcessor&) const override; |
| 535 | 548 |
| 536 void onComputeInvariantOutput(GrInvariantOutput* inout) const override { | 549 void onComputeInvariantOutput(GrInvariantOutput* inout) const override { |
| 537 // lighting shaders are complicated. We just throw up our hands. | 550 // lighting shaders are complicated. We just throw up our hands. |
| 538 inout->mulByUnknownFourComponents(); | 551 inout->mulByUnknownFourComponents(); |
| 539 } | 552 } |
| 540 | 553 |
| 541 private: | 554 private: |
| 542 const SkImageFilterLight* fLight; | 555 const SkImageFilterLight* fLight; |
| 543 SkScalar fSurfaceScale; | 556 SkScalar fSurfaceScale; |
| 544 SkMatrix fFilterMatrix; | 557 SkMatrix fFilterMatrix; |
| 545 BoundaryMode fBoundaryMode; | 558 BoundaryMode fBoundaryMode; |
| 559 GrTextureDomain fDomain; |
| 546 | 560 |
| 547 typedef GrSingleTextureEffect INHERITED; | 561 typedef GrSingleTextureEffect INHERITED; |
| 548 }; | 562 }; |
| 549 | 563 |
| 550 class GrDiffuseLightingEffect : public GrLightingEffect { | 564 class GrDiffuseLightingEffect : public GrLightingEffect { |
| 551 public: | 565 public: |
| 552 static GrFragmentProcessor* Create(GrTexture* texture, | 566 static GrFragmentProcessor* Create(GrTexture* texture, |
| 553 const SkImageFilterLight* light, | 567 const SkImageFilterLight* light, |
| 554 SkScalar surfaceScale, | 568 SkScalar surfaceScale, |
| 555 const SkMatrix& matrix, | 569 const SkMatrix& matrix, |
| 556 SkScalar kd, | 570 SkScalar kd, |
| 557 BoundaryMode boundaryMode) { | 571 BoundaryMode boundaryMode, |
| 558 return new GrDiffuseLightingEffect(texture, light, surfaceScale, matrix,
kd, boundaryMode); | 572 const SkIRect* srcBounds) { |
| 573 return new GrDiffuseLightingEffect(texture, light, surfaceScale, matrix,
kd, boundaryMode, |
| 574 srcBounds); |
| 559 } | 575 } |
| 560 | 576 |
| 561 const char* name() const override { return "DiffuseLighting"; } | 577 const char* name() const override { return "DiffuseLighting"; } |
| 562 | 578 |
| 563 SkScalar kd() const { return fKD; } | 579 SkScalar kd() const { return fKD; } |
| 564 | 580 |
| 565 private: | 581 private: |
| 566 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; | 582 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; |
| 567 | 583 |
| 568 void onGetGLSLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const
override; | 584 void onGetGLSLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const
override; |
| 569 | 585 |
| 570 bool onIsEqual(const GrFragmentProcessor&) const override; | 586 bool onIsEqual(const GrFragmentProcessor&) const override; |
| 571 | 587 |
| 572 GrDiffuseLightingEffect(GrTexture* texture, | 588 GrDiffuseLightingEffect(GrTexture* texture, |
| 573 const SkImageFilterLight* light, | 589 const SkImageFilterLight* light, |
| 574 SkScalar surfaceScale, | 590 SkScalar surfaceScale, |
| 575 const SkMatrix& matrix, | 591 const SkMatrix& matrix, |
| 576 SkScalar kd, | 592 SkScalar kd, |
| 577 BoundaryMode boundaryMode); | 593 BoundaryMode boundaryMode, |
| 594 const SkIRect* srcBounds); |
| 578 | 595 |
| 579 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 596 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
| 580 typedef GrLightingEffect INHERITED; | 597 typedef GrLightingEffect INHERITED; |
| 581 SkScalar fKD; | 598 SkScalar fKD; |
| 582 }; | 599 }; |
| 583 | 600 |
| 584 class GrSpecularLightingEffect : public GrLightingEffect { | 601 class GrSpecularLightingEffect : public GrLightingEffect { |
| 585 public: | 602 public: |
| 586 static GrFragmentProcessor* Create(GrTexture* texture, | 603 static GrFragmentProcessor* Create(GrTexture* texture, |
| 587 const SkImageFilterLight* light, | 604 const SkImageFilterLight* light, |
| 588 SkScalar surfaceScale, | 605 SkScalar surfaceScale, |
| 589 const SkMatrix& matrix, | 606 const SkMatrix& matrix, |
| 590 SkScalar ks, | 607 SkScalar ks, |
| 591 SkScalar shininess, | 608 SkScalar shininess, |
| 592 BoundaryMode boundaryMode) { | 609 BoundaryMode boundaryMode, |
| 610 const SkIRect* srcBounds) { |
| 593 return new GrSpecularLightingEffect(texture, light, surfaceScale, matrix
, ks, shininess, | 611 return new GrSpecularLightingEffect(texture, light, surfaceScale, matrix
, ks, shininess, |
| 594 boundaryMode); | 612 boundaryMode, srcBounds); |
| 595 } | 613 } |
| 596 | 614 |
| 597 const char* name() const override { return "SpecularLighting"; } | 615 const char* name() const override { return "SpecularLighting"; } |
| 598 | 616 |
| 599 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; | 617 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; |
| 600 | 618 |
| 601 SkScalar ks() const { return fKS; } | 619 SkScalar ks() const { return fKS; } |
| 602 SkScalar shininess() const { return fShininess; } | 620 SkScalar shininess() const { return fShininess; } |
| 603 | 621 |
| 604 private: | 622 private: |
| 605 void onGetGLSLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const
override; | 623 void onGetGLSLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const
override; |
| 606 | 624 |
| 607 bool onIsEqual(const GrFragmentProcessor&) const override; | 625 bool onIsEqual(const GrFragmentProcessor&) const override; |
| 608 | 626 |
| 609 GrSpecularLightingEffect(GrTexture* texture, | 627 GrSpecularLightingEffect(GrTexture* texture, |
| 610 const SkImageFilterLight* light, | 628 const SkImageFilterLight* light, |
| 611 SkScalar surfaceScale, | 629 SkScalar surfaceScale, |
| 612 const SkMatrix& matrix, | 630 const SkMatrix& matrix, |
| 613 SkScalar ks, | 631 SkScalar ks, |
| 614 SkScalar shininess, | 632 SkScalar shininess, |
| 615 BoundaryMode boundaryMode); | 633 BoundaryMode boundaryMode, |
| 634 const SkIRect* srcBounds); |
| 616 | 635 |
| 617 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 636 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
| 618 typedef GrLightingEffect INHERITED; | 637 typedef GrLightingEffect INHERITED; |
| 619 SkScalar fKS; | 638 SkScalar fKS; |
| 620 SkScalar fShininess; | 639 SkScalar fShininess; |
| 621 }; | 640 }; |
| 622 | 641 |
| 623 /////////////////////////////////////////////////////////////////////////////// | 642 /////////////////////////////////////////////////////////////////////////////// |
| 624 | 643 |
| 625 class GrGLLight { | 644 class GrGLLight { |
| (...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1284 str->appendf("SkDiffuseLightingImageFilter: ("); | 1303 str->appendf("SkDiffuseLightingImageFilter: ("); |
| 1285 str->appendf("kD: %f\n", fKD); | 1304 str->appendf("kD: %f\n", fKD); |
| 1286 str->append(")"); | 1305 str->append(")"); |
| 1287 } | 1306 } |
| 1288 #endif | 1307 #endif |
| 1289 | 1308 |
| 1290 #if SK_SUPPORT_GPU | 1309 #if SK_SUPPORT_GPU |
| 1291 GrFragmentProcessor* SkDiffuseLightingImageFilter::getFragmentProcessor( | 1310 GrFragmentProcessor* SkDiffuseLightingImageFilter::getFragmentProcessor( |
| 1292 GrTexture* texture, | 1311 GrTexture* texture, |
| 1293 const SkMatrix& matrix, | 1312 const SkMatrix& matrix, |
| 1294 const SkIRect&, | 1313 const SkIRect* srcBounds, |
| 1295 BoundaryMode boundaryMode | 1314 BoundaryMode boundaryMode) co
nst { |
| 1296 ) const { | |
| 1297 SkScalar scale = SkScalarMul(this->surfaceScale(), SkIntToScalar(255)); | 1315 SkScalar scale = SkScalarMul(this->surfaceScale(), SkIntToScalar(255)); |
| 1298 return GrDiffuseLightingEffect::Create(texture, this->light(), scale, matrix
, this->kd(), | 1316 return GrDiffuseLightingEffect::Create(texture, this->light(), scale, matrix
, this->kd(), |
| 1299 boundaryMode); | 1317 boundaryMode, srcBounds); |
| 1300 } | 1318 } |
| 1301 #endif | 1319 #endif |
| 1302 | 1320 |
| 1303 /////////////////////////////////////////////////////////////////////////////// | 1321 /////////////////////////////////////////////////////////////////////////////// |
| 1304 | 1322 |
| 1305 SkImageFilter* SkSpecularLightingImageFilter::Create(SkImageFilterLight* light, | 1323 SkImageFilter* SkSpecularLightingImageFilter::Create(SkImageFilterLight* light, |
| 1306 SkScalar surfaceScale, | 1324 SkScalar surfaceScale, |
| 1307 SkScalar ks, | 1325 SkScalar ks, |
| 1308 SkScalar shininess, | 1326 SkScalar shininess, |
| 1309 SkImageFilter* input, | 1327 SkImageFilter* input, |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1428 str->appendf("SkSpecularLightingImageFilter: ("); | 1446 str->appendf("SkSpecularLightingImageFilter: ("); |
| 1429 str->appendf("kS: %f shininess: %f", fKS, fShininess); | 1447 str->appendf("kS: %f shininess: %f", fKS, fShininess); |
| 1430 str->append(")"); | 1448 str->append(")"); |
| 1431 } | 1449 } |
| 1432 #endif | 1450 #endif |
| 1433 | 1451 |
| 1434 #if SK_SUPPORT_GPU | 1452 #if SK_SUPPORT_GPU |
| 1435 GrFragmentProcessor* SkSpecularLightingImageFilter::getFragmentProcessor( | 1453 GrFragmentProcessor* SkSpecularLightingImageFilter::getFragmentProcessor( |
| 1436 GrTexture* texture, | 1454 GrTexture* texture, |
| 1437 const SkMatrix& matrix, | 1455 const SkMatrix& matrix, |
| 1438 const SkIRect&, | 1456 const SkIRect* srcBounds, |
| 1439 BoundaryMode boundaryMode) c
onst { | 1457 BoundaryMode boundaryMode) c
onst { |
| 1440 SkScalar scale = SkScalarMul(this->surfaceScale(), SkIntToScalar(255)); | 1458 SkScalar scale = SkScalarMul(this->surfaceScale(), SkIntToScalar(255)); |
| 1441 return GrSpecularLightingEffect::Create(texture, this->light(), scale, matri
x, this->ks(), | 1459 return GrSpecularLightingEffect::Create(texture, this->light(), scale, matri
x, this->ks(), |
| 1442 this->shininess(), boundaryMode); | 1460 this->shininess(), boundaryMode, src
Bounds); |
| 1443 } | 1461 } |
| 1444 #endif | 1462 #endif |
| 1445 | 1463 |
| 1446 /////////////////////////////////////////////////////////////////////////////// | 1464 /////////////////////////////////////////////////////////////////////////////// |
| 1447 | 1465 |
| 1448 #if SK_SUPPORT_GPU | 1466 #if SK_SUPPORT_GPU |
| 1449 | 1467 |
| 1450 namespace { | 1468 namespace { |
| 1451 SkPoint3 random_point3(SkRandom* random) { | 1469 SkPoint3 random_point3(SkRandom* random) { |
| 1452 return SkPoint3::Make(SkScalarToFloat(random->nextSScalar1()), | 1470 return SkPoint3::Make(SkScalarToFloat(random->nextSScalar1()), |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1565 */ | 1583 */ |
| 1566 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; | 1584 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
| 1567 | 1585 |
| 1568 virtual void emitLightFunc(GrGLSLUniformHandler*, | 1586 virtual void emitLightFunc(GrGLSLUniformHandler*, |
| 1569 GrGLSLFragmentBuilder*, | 1587 GrGLSLFragmentBuilder*, |
| 1570 SkString* funcName) = 0; | 1588 SkString* funcName) = 0; |
| 1571 | 1589 |
| 1572 private: | 1590 private: |
| 1573 typedef GrGLSLFragmentProcessor INHERITED; | 1591 typedef GrGLSLFragmentProcessor INHERITED; |
| 1574 | 1592 |
| 1575 UniformHandle fImageIncrementUni; | 1593 UniformHandle fImageIncrementUni; |
| 1576 UniformHandle fSurfaceScaleUni; | 1594 UniformHandle fSurfaceScaleUni; |
| 1577 GrGLLight* fLight; | 1595 GrTextureDomain::GLDomain fDomain; |
| 1596 GrGLLight* fLight; |
| 1578 }; | 1597 }; |
| 1579 | 1598 |
| 1580 /////////////////////////////////////////////////////////////////////////////// | 1599 /////////////////////////////////////////////////////////////////////////////// |
| 1581 | 1600 |
| 1582 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { | 1601 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { |
| 1583 public: | 1602 public: |
| 1584 void emitLightFunc(GrGLSLUniformHandler*, GrGLSLFragmentBuilder*, SkString*
funcName) override; | 1603 void emitLightFunc(GrGLSLUniformHandler*, GrGLSLFragmentBuilder*, SkString*
funcName) override; |
| 1585 | 1604 |
| 1586 protected: | 1605 protected: |
| 1587 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; | 1606 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1603 | 1622 |
| 1604 private: | 1623 private: |
| 1605 typedef GrGLLightingEffect INHERITED; | 1624 typedef GrGLLightingEffect INHERITED; |
| 1606 | 1625 |
| 1607 UniformHandle fKSUni; | 1626 UniformHandle fKSUni; |
| 1608 UniformHandle fShininessUni; | 1627 UniformHandle fShininessUni; |
| 1609 }; | 1628 }; |
| 1610 | 1629 |
| 1611 /////////////////////////////////////////////////////////////////////////////// | 1630 /////////////////////////////////////////////////////////////////////////////// |
| 1612 | 1631 |
| 1632 namespace { |
| 1633 |
| 1634 GrTextureDomain create_domain(GrTexture* texture, const SkIRect* srcBounds, |
| 1635 GrTextureDomain::Mode mode) { |
| 1636 if (srcBounds) { |
| 1637 SkRect texelDomain = GrTextureDomain::MakeTexelDomainForMode(texture, *s
rcBounds, mode); |
| 1638 return GrTextureDomain(texelDomain, mode); |
| 1639 } else { |
| 1640 return GrTextureDomain(SkRect::MakeEmpty(), GrTextureDomain::kIgnore_Mod
e); |
| 1641 } |
| 1642 } |
| 1643 |
| 1644 }; |
| 1645 |
| 1613 GrLightingEffect::GrLightingEffect(GrTexture* texture, | 1646 GrLightingEffect::GrLightingEffect(GrTexture* texture, |
| 1614 const SkImageFilterLight* light, | 1647 const SkImageFilterLight* light, |
| 1615 SkScalar surfaceScale, | 1648 SkScalar surfaceScale, |
| 1616 const SkMatrix& matrix, | 1649 const SkMatrix& matrix, |
| 1617 BoundaryMode boundaryMode) | 1650 BoundaryMode boundaryMode, |
| 1651 const SkIRect* srcBounds) |
| 1618 : INHERITED(texture, GrCoordTransform::MakeDivByTextureWHMatrix(texture)) | 1652 : INHERITED(texture, GrCoordTransform::MakeDivByTextureWHMatrix(texture)) |
| 1619 , fLight(light) | 1653 , fLight(light) |
| 1620 , fSurfaceScale(surfaceScale) | 1654 , fSurfaceScale(surfaceScale) |
| 1621 , fFilterMatrix(matrix) | 1655 , fFilterMatrix(matrix) |
| 1622 , fBoundaryMode(boundaryMode) { | 1656 , fBoundaryMode(boundaryMode) |
| 1657 , fDomain(create_domain(texture, srcBounds, GrTextureDomain::kDecal_Mode)) { |
| 1623 fLight->ref(); | 1658 fLight->ref(); |
| 1624 if (light->requiresFragmentPosition()) { | 1659 if (light->requiresFragmentPosition()) { |
| 1625 this->setWillReadFragmentPosition(); | 1660 this->setWillReadFragmentPosition(); |
| 1626 } | 1661 } |
| 1627 } | 1662 } |
| 1628 | 1663 |
| 1629 GrLightingEffect::~GrLightingEffect() { | 1664 GrLightingEffect::~GrLightingEffect() { |
| 1630 fLight->unref(); | 1665 fLight->unref(); |
| 1631 } | 1666 } |
| 1632 | 1667 |
| 1633 bool GrLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const { | 1668 bool GrLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const { |
| 1634 const GrLightingEffect& s = sBase.cast<GrLightingEffect>(); | 1669 const GrLightingEffect& s = sBase.cast<GrLightingEffect>(); |
| 1635 return fLight->isEqual(*s.fLight) && | 1670 return fLight->isEqual(*s.fLight) && |
| 1636 fSurfaceScale == s.fSurfaceScale && | 1671 fSurfaceScale == s.fSurfaceScale && |
| 1637 fBoundaryMode == s.fBoundaryMode; | 1672 fBoundaryMode == s.fBoundaryMode; |
| 1638 } | 1673 } |
| 1639 | 1674 |
| 1640 /////////////////////////////////////////////////////////////////////////////// | 1675 /////////////////////////////////////////////////////////////////////////////// |
| 1641 | 1676 |
| 1642 GrDiffuseLightingEffect::GrDiffuseLightingEffect(GrTexture* texture, | 1677 GrDiffuseLightingEffect::GrDiffuseLightingEffect(GrTexture* texture, |
| 1643 const SkImageFilterLight* light
, | 1678 const SkImageFilterLight* light
, |
| 1644 SkScalar surfaceScale, | 1679 SkScalar surfaceScale, |
| 1645 const SkMatrix& matrix, | 1680 const SkMatrix& matrix, |
| 1646 SkScalar kd, | 1681 SkScalar kd, |
| 1647 BoundaryMode boundaryMode) | 1682 BoundaryMode boundaryMode, |
| 1648 : INHERITED(texture, light, surfaceScale, matrix, boundaryMode), fKD(kd) { | 1683 const SkIRect* srcBounds) |
| 1684 : INHERITED(texture, light, surfaceScale, matrix, boundaryMode, srcBounds),
fKD(kd) { |
| 1649 this->initClassID<GrDiffuseLightingEffect>(); | 1685 this->initClassID<GrDiffuseLightingEffect>(); |
| 1650 } | 1686 } |
| 1651 | 1687 |
| 1652 bool GrDiffuseLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const
{ | 1688 bool GrDiffuseLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const
{ |
| 1653 const GrDiffuseLightingEffect& s = sBase.cast<GrDiffuseLightingEffect>(); | 1689 const GrDiffuseLightingEffect& s = sBase.cast<GrDiffuseLightingEffect>(); |
| 1654 return INHERITED::onIsEqual(sBase) && this->kd() == s.kd(); | 1690 return INHERITED::onIsEqual(sBase) && this->kd() == s.kd(); |
| 1655 } | 1691 } |
| 1656 | 1692 |
| 1657 void GrDiffuseLightingEffect::onGetGLSLProcessorKey(const GrGLSLCaps& caps, | 1693 void GrDiffuseLightingEffect::onGetGLSLProcessorKey(const GrGLSLCaps& caps, |
| 1658 GrProcessorKeyBuilder* b) co
nst { | 1694 GrProcessorKeyBuilder* b) co
nst { |
| 1659 GrGLDiffuseLightingEffect::GenKey(*this, caps, b); | 1695 GrGLDiffuseLightingEffect::GenKey(*this, caps, b); |
| 1660 } | 1696 } |
| 1661 | 1697 |
| 1662 GrGLSLFragmentProcessor* GrDiffuseLightingEffect::onCreateGLSLInstance() const { | 1698 GrGLSLFragmentProcessor* GrDiffuseLightingEffect::onCreateGLSLInstance() const { |
| 1663 return new GrGLDiffuseLightingEffect; | 1699 return new GrGLDiffuseLightingEffect; |
| 1664 } | 1700 } |
| 1665 | 1701 |
| 1666 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrDiffuseLightingEffect); | 1702 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrDiffuseLightingEffect); |
| 1667 | 1703 |
| 1668 const GrFragmentProcessor* GrDiffuseLightingEffect::TestCreate(GrProcessorTestDa
ta* d) { | 1704 const GrFragmentProcessor* GrDiffuseLightingEffect::TestCreate(GrProcessorTestDa
ta* d) { |
| 1705 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: |
| 1706 GrProcessorUnitTest::kAlphaTextureIdx; |
| 1707 GrTexture* tex = d->fTextures[texIdx]; |
| 1669 SkScalar surfaceScale = d->fRandom->nextSScalar1(); | 1708 SkScalar surfaceScale = d->fRandom->nextSScalar1(); |
| 1670 SkScalar kd = d->fRandom->nextUScalar1(); | 1709 SkScalar kd = d->fRandom->nextUScalar1(); |
| 1671 SkAutoTUnref<SkImageFilterLight> light(create_random_light(d->fRandom)); | 1710 SkAutoTUnref<SkImageFilterLight> light(create_random_light(d->fRandom)); |
| 1672 SkMatrix matrix; | 1711 SkMatrix matrix; |
| 1673 for (int i = 0; i < 9; i++) { | 1712 for (int i = 0; i < 9; i++) { |
| 1674 matrix[i] = d->fRandom->nextUScalar1(); | 1713 matrix[i] = d->fRandom->nextUScalar1(); |
| 1675 } | 1714 } |
| 1715 SkIRect srcBounds = SkIRect::MakeXYWH(d->fRandom->nextRangeU(0, tex->width()
), |
| 1716 d->fRandom->nextRangeU(0, tex->height(
)), |
| 1717 d->fRandom->nextRangeU(0, tex->width()
), |
| 1718 d->fRandom->nextRangeU(0, tex->height(
))); |
| 1676 BoundaryMode mode = static_cast<BoundaryMode>(d->fRandom->nextU() % kBoundar
yModeCount); | 1719 BoundaryMode mode = static_cast<BoundaryMode>(d->fRandom->nextU() % kBoundar
yModeCount); |
| 1677 return GrDiffuseLightingEffect::Create(d->fTextures[GrProcessorUnitTest::kAl
phaTextureIdx], | 1720 return GrDiffuseLightingEffect::Create(tex, light, surfaceScale, matrix, kd,
mode, &srcBounds); |
| 1678 light, surfaceScale, matrix, kd, mode
); | |
| 1679 } | 1721 } |
| 1680 | 1722 |
| 1681 | 1723 |
| 1682 /////////////////////////////////////////////////////////////////////////////// | 1724 /////////////////////////////////////////////////////////////////////////////// |
| 1683 | 1725 |
| 1684 void GrGLLightingEffect::emitCode(EmitArgs& args) { | 1726 void GrGLLightingEffect::emitCode(EmitArgs& args) { |
| 1685 const GrLightingEffect& le = args.fFp.cast<GrLightingEffect>(); | 1727 const GrLightingEffect& le = args.fFp.cast<GrLightingEffect>(); |
| 1686 if (!fLight) { | 1728 if (!fLight) { |
| 1687 fLight = le.light()->createGLLight(); | 1729 fLight = le.light()->createGLLight(); |
| 1688 } | 1730 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1748 fragBuilder->codeAppend("\t\tfloat m[9];\n"); | 1790 fragBuilder->codeAppend("\t\tfloat m[9];\n"); |
| 1749 | 1791 |
| 1750 const char* imgInc = uniformHandler->getUniformCStr(fImageIncrementUni); | 1792 const char* imgInc = uniformHandler->getUniformCStr(fImageIncrementUni); |
| 1751 const char* surfScale = uniformHandler->getUniformCStr(fSurfaceScaleUni); | 1793 const char* surfScale = uniformHandler->getUniformCStr(fSurfaceScaleUni); |
| 1752 | 1794 |
| 1753 int index = 0; | 1795 int index = 0; |
| 1754 for (int dy = 1; dy >= -1; dy--) { | 1796 for (int dy = 1; dy >= -1; dy--) { |
| 1755 for (int dx = -1; dx <= 1; dx++) { | 1797 for (int dx = -1; dx <= 1; dx++) { |
| 1756 SkString texCoords; | 1798 SkString texCoords; |
| 1757 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); | 1799 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); |
| 1758 fragBuilder->codeAppendf("\t\tm[%d] = ", index++); | 1800 SkString temp; |
| 1759 fragBuilder->appendTextureLookup(args.fSamplers[0], texCoords.c_str(
)); | 1801 temp.appendf("temp%d", index); |
| 1760 fragBuilder->codeAppend(".a;\n"); | 1802 fragBuilder->codeAppendf("vec4 %s;", temp.c_str()); |
| 1803 fDomain.sampleTexture(fragBuilder, |
| 1804 args.fUniformHandler, |
| 1805 args.fGLSLCaps, |
| 1806 le.domain(), |
| 1807 temp.c_str(), |
| 1808 texCoords, |
| 1809 args.fSamplers[0]); |
| 1810 fragBuilder->codeAppendf("m[%d] = %s.a;", index, temp.c_str()); |
| 1811 index++; |
| 1761 } | 1812 } |
| 1762 } | 1813 } |
| 1763 fragBuilder->codeAppend("\t\tvec3 surfaceToLight = "); | 1814 fragBuilder->codeAppend("\t\tvec3 surfaceToLight = "); |
| 1764 SkString arg; | 1815 SkString arg; |
| 1765 arg.appendf("%s * m[4]", surfScale); | 1816 arg.appendf("%s * m[4]", surfScale); |
| 1766 fLight->emitSurfaceToLight(uniformHandler, fragBuilder, arg.c_str()); | 1817 fLight->emitSurfaceToLight(uniformHandler, fragBuilder, arg.c_str()); |
| 1767 fragBuilder->codeAppend(";\n"); | 1818 fragBuilder->codeAppend(";\n"); |
| 1768 fragBuilder->codeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ", | 1819 fragBuilder->codeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ", |
| 1769 args.fOutputColor, lightFunc.c_str(), normalName.c_
str(), surfScale); | 1820 args.fOutputColor, lightFunc.c_str(), normalName.c_
str(), surfScale); |
| 1770 fLight->emitLightColor(uniformHandler, fragBuilder, "surfaceToLight"); | 1821 fLight->emitLightColor(uniformHandler, fragBuilder, "surfaceToLight"); |
| 1771 fragBuilder->codeAppend(");\n"); | 1822 fragBuilder->codeAppend(");\n"); |
| 1772 SkString modulate; | 1823 SkString modulate; |
| 1773 GrGLSLMulVarBy4f(&modulate, args.fOutputColor, args.fInputColor); | 1824 GrGLSLMulVarBy4f(&modulate, args.fOutputColor, args.fInputColor); |
| 1774 fragBuilder->codeAppend(modulate.c_str()); | 1825 fragBuilder->codeAppend(modulate.c_str()); |
| 1775 } | 1826 } |
| 1776 | 1827 |
| 1777 void GrGLLightingEffect::GenKey(const GrProcessor& proc, | 1828 void GrGLLightingEffect::GenKey(const GrProcessor& proc, |
| 1778 const GrGLSLCaps& caps, GrProcessorKeyBuilder* b
) { | 1829 const GrGLSLCaps& caps, GrProcessorKeyBuilder* b
) { |
| 1779 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); | 1830 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); |
| 1780 b->add32(lighting.boundaryMode() << 2 | lighting.light()->type()); | 1831 b->add32(lighting.boundaryMode() << 2 | lighting.light()->type()); |
| 1832 b->add32(GrTextureDomain::GLDomain::DomainKey(lighting.domain())); |
| 1781 } | 1833 } |
| 1782 | 1834 |
| 1783 void GrGLLightingEffect::onSetData(const GrGLSLProgramDataManager& pdman, | 1835 void GrGLLightingEffect::onSetData(const GrGLSLProgramDataManager& pdman, |
| 1784 const GrProcessor& proc) { | 1836 const GrProcessor& proc) { |
| 1785 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); | 1837 const GrLightingEffect& lighting = proc.cast<GrLightingEffect>(); |
| 1786 if (!fLight) { | 1838 if (!fLight) { |
| 1787 fLight = lighting.light()->createGLLight(); | 1839 fLight = lighting.light()->createGLLight(); |
| 1788 } | 1840 } |
| 1789 | 1841 |
| 1790 GrTexture* texture = lighting.texture(0); | 1842 GrTexture* texture = lighting.texture(0); |
| 1791 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; | 1843 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; |
| 1792 pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->he
ight()); | 1844 pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->he
ight()); |
| 1793 pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); | 1845 pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); |
| 1794 SkAutoTUnref<SkImageFilterLight> transformedLight( | 1846 SkAutoTUnref<SkImageFilterLight> transformedLight( |
| 1795 lighting.light()->transform(lighting
.filterMatrix())); | 1847 lighting.light()->transform(lighting
.filterMatrix())); |
| 1848 fDomain.setData(pdman, lighting.domain(), texture->origin()); |
| 1796 fLight->setData(pdman, transformedLight); | 1849 fLight->setData(pdman, transformedLight); |
| 1797 } | 1850 } |
| 1798 | 1851 |
| 1799 /////////////////////////////////////////////////////////////////////////////// | 1852 /////////////////////////////////////////////////////////////////////////////// |
| 1800 | 1853 |
| 1801 /////////////////////////////////////////////////////////////////////////////// | 1854 /////////////////////////////////////////////////////////////////////////////// |
| 1802 | 1855 |
| 1803 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHandl
er, | 1856 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHandl
er, |
| 1804 GrGLSLFragmentBuilder* fragBuilder
, | 1857 GrGLSLFragmentBuilder* fragBuilder
, |
| 1805 SkString* funcName) { | 1858 SkString* funcName) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1832 } | 1885 } |
| 1833 | 1886 |
| 1834 /////////////////////////////////////////////////////////////////////////////// | 1887 /////////////////////////////////////////////////////////////////////////////// |
| 1835 | 1888 |
| 1836 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, | 1889 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, |
| 1837 const SkImageFilterLight* lig
ht, | 1890 const SkImageFilterLight* lig
ht, |
| 1838 SkScalar surfaceScale, | 1891 SkScalar surfaceScale, |
| 1839 const SkMatrix& matrix, | 1892 const SkMatrix& matrix, |
| 1840 SkScalar ks, | 1893 SkScalar ks, |
| 1841 SkScalar shininess, | 1894 SkScalar shininess, |
| 1842 BoundaryMode boundaryMode) | 1895 BoundaryMode boundaryMode, |
| 1843 : INHERITED(texture, light, surfaceScale, matrix, boundaryMode) | 1896 const SkIRect* srcBounds) |
| 1897 : INHERITED(texture, light, surfaceScale, matrix, boundaryMode, srcBounds) |
| 1844 , fKS(ks) | 1898 , fKS(ks) |
| 1845 , fShininess(shininess) { | 1899 , fShininess(shininess) { |
| 1846 this->initClassID<GrSpecularLightingEffect>(); | 1900 this->initClassID<GrSpecularLightingEffect>(); |
| 1847 } | 1901 } |
| 1848 | 1902 |
| 1849 bool GrSpecularLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const
{ | 1903 bool GrSpecularLightingEffect::onIsEqual(const GrFragmentProcessor& sBase) const
{ |
| 1850 const GrSpecularLightingEffect& s = sBase.cast<GrSpecularLightingEffect>(); | 1904 const GrSpecularLightingEffect& s = sBase.cast<GrSpecularLightingEffect>(); |
| 1851 return INHERITED::onIsEqual(sBase) && | 1905 return INHERITED::onIsEqual(sBase) && |
| 1852 this->ks() == s.ks() && | 1906 this->ks() == s.ks() && |
| 1853 this->shininess() == s.shininess(); | 1907 this->shininess() == s.shininess(); |
| 1854 } | 1908 } |
| 1855 | 1909 |
| 1856 void GrSpecularLightingEffect::onGetGLSLProcessorKey(const GrGLSLCaps& caps, | 1910 void GrSpecularLightingEffect::onGetGLSLProcessorKey(const GrGLSLCaps& caps, |
| 1857 GrProcessorKeyBuilder* b) c
onst { | 1911 GrProcessorKeyBuilder* b) c
onst { |
| 1858 GrGLSpecularLightingEffect::GenKey(*this, caps, b); | 1912 GrGLSpecularLightingEffect::GenKey(*this, caps, b); |
| 1859 } | 1913 } |
| 1860 | 1914 |
| 1861 GrGLSLFragmentProcessor* GrSpecularLightingEffect::onCreateGLSLInstance() const
{ | 1915 GrGLSLFragmentProcessor* GrSpecularLightingEffect::onCreateGLSLInstance() const
{ |
| 1862 return new GrGLSpecularLightingEffect; | 1916 return new GrGLSpecularLightingEffect; |
| 1863 } | 1917 } |
| 1864 | 1918 |
| 1865 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSpecularLightingEffect); | 1919 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSpecularLightingEffect); |
| 1866 | 1920 |
| 1867 const GrFragmentProcessor* GrSpecularLightingEffect::TestCreate(GrProcessorTestD
ata* d) { | 1921 const GrFragmentProcessor* GrSpecularLightingEffect::TestCreate(GrProcessorTestD
ata* d) { |
| 1922 int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: |
| 1923 GrProcessorUnitTest::kAlphaTextureIdx; |
| 1924 GrTexture* tex = d->fTextures[texIdx]; |
| 1868 SkScalar surfaceScale = d->fRandom->nextSScalar1(); | 1925 SkScalar surfaceScale = d->fRandom->nextSScalar1(); |
| 1869 SkScalar ks = d->fRandom->nextUScalar1(); | 1926 SkScalar ks = d->fRandom->nextUScalar1(); |
| 1870 SkScalar shininess = d->fRandom->nextUScalar1(); | 1927 SkScalar shininess = d->fRandom->nextUScalar1(); |
| 1871 SkAutoTUnref<SkImageFilterLight> light(create_random_light(d->fRandom)); | 1928 SkAutoTUnref<SkImageFilterLight> light(create_random_light(d->fRandom)); |
| 1872 SkMatrix matrix; | 1929 SkMatrix matrix; |
| 1873 for (int i = 0; i < 9; i++) { | 1930 for (int i = 0; i < 9; i++) { |
| 1874 matrix[i] = d->fRandom->nextUScalar1(); | 1931 matrix[i] = d->fRandom->nextUScalar1(); |
| 1875 } | 1932 } |
| 1876 BoundaryMode mode = static_cast<BoundaryMode>(d->fRandom->nextU() % kBoundar
yModeCount); | 1933 BoundaryMode mode = static_cast<BoundaryMode>(d->fRandom->nextU() % kBoundar
yModeCount); |
| 1934 SkIRect srcBounds = SkIRect::MakeXYWH(d->fRandom->nextRangeU(0, tex->width()
), |
| 1935 d->fRandom->nextRangeU(0, tex->height(
)), |
| 1936 d->fRandom->nextRangeU(0, tex->width()
), |
| 1937 d->fRandom->nextRangeU(0, tex->height(
))); |
| 1877 return GrSpecularLightingEffect::Create(d->fTextures[GrProcessorUnitTest::kA
lphaTextureIdx], | 1938 return GrSpecularLightingEffect::Create(d->fTextures[GrProcessorUnitTest::kA
lphaTextureIdx], |
| 1878 light, surfaceScale, matrix, ks, shi
niness, mode); | 1939 light, surfaceScale, matrix, ks, shi
niness, mode, |
| 1940 &srcBounds); |
| 1879 } | 1941 } |
| 1880 | 1942 |
| 1881 /////////////////////////////////////////////////////////////////////////////// | 1943 /////////////////////////////////////////////////////////////////////////////// |
| 1882 | 1944 |
| 1883 void GrGLSpecularLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHand
ler, | 1945 void GrGLSpecularLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHand
ler, |
| 1884 GrGLSLFragmentBuilder* fragBuilde
r, | 1946 GrGLSLFragmentBuilder* fragBuilde
r, |
| 1885 SkString* funcName) { | 1947 SkString* funcName) { |
| 1886 const char* ks; | 1948 const char* ks; |
| 1887 const char* shininess; | 1949 const char* shininess; |
| 1888 | 1950 |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2056 | 2118 |
| 2057 fragBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 2119 fragBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
| 2058 } | 2120 } |
| 2059 | 2121 |
| 2060 #endif | 2122 #endif |
| 2061 | 2123 |
| 2062 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 2124 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
| 2063 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 2125 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
| 2064 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 2126 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
| 2065 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 2127 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |