| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
| 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 "SkDisplacementMapEffect.h" | 8 #include "SkDisplacementMapEffect.h" |
| 9 #include "SkReadBuffer.h" | 9 #include "SkReadBuffer.h" |
| 10 #include "SkWriteBuffer.h" | 10 #include "SkWriteBuffer.h" |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 GrTextureDomain::GLDomain fGLDomain; | 325 GrTextureDomain::GLDomain fGLDomain; |
| 326 | 326 |
| 327 typedef GrGLFragmentProcessor INHERITED; | 327 typedef GrGLFragmentProcessor INHERITED; |
| 328 }; | 328 }; |
| 329 | 329 |
| 330 /////////////////////////////////////////////////////////////////////////////// | 330 /////////////////////////////////////////////////////////////////////////////// |
| 331 | 331 |
| 332 class GrDisplacementMapEffect : public GrFragmentProcessor { | 332 class GrDisplacementMapEffect : public GrFragmentProcessor { |
| 333 public: | 333 public: |
| 334 static GrFragmentProcessor* Create( | 334 static GrFragmentProcessor* Create( |
| 335 GrShaderDataManager* shaderDataManager, | 335 GrProcessorDataManager* procDataManager, |
| 336 SkDisplacementMapEffect::ChannelSelectorType xChannelSelector, | 336 SkDisplacementMapEffect::ChannelSelectorType xChannelSelector, |
| 337 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector, SkVec
tor scale, | 337 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector, SkVec
tor scale, |
| 338 GrTexture* displacement, const SkMatrix& offsetMatrix, GrTexture* co
lor, | 338 GrTexture* displacement, const SkMatrix& offsetMatrix, GrTexture* co
lor, |
| 339 const SkISize& colorDimensions) { | 339 const SkISize& colorDimensions) { |
| 340 return SkNEW_ARGS(GrDisplacementMapEffect, (shaderDataManager, | 340 return SkNEW_ARGS(GrDisplacementMapEffect, (procDataManager, |
| 341 xChannelSelector, | 341 xChannelSelector, |
| 342 yChannelSelector, | 342 yChannelSelector, |
| 343 scale, | 343 scale, |
| 344 displacement, | 344 displacement, |
| 345 offsetMatrix, | 345 offsetMatrix, |
| 346 color, | 346 color, |
| 347 colorDimensions)); | 347 colorDimensions)); |
| 348 } | 348 } |
| 349 | 349 |
| 350 virtual ~GrDisplacementMapEffect(); | 350 virtual ~GrDisplacementMapEffect(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 365 const SkVector& scale() const { return fScale; } | 365 const SkVector& scale() const { return fScale; } |
| 366 | 366 |
| 367 const char* name() const override { return "DisplacementMap"; } | 367 const char* name() const override { return "DisplacementMap"; } |
| 368 const GrTextureDomain& domain() const { return fDomain; } | 368 const GrTextureDomain& domain() const { return fDomain; } |
| 369 | 369 |
| 370 private: | 370 private: |
| 371 bool onIsEqual(const GrFragmentProcessor&) const override; | 371 bool onIsEqual(const GrFragmentProcessor&) const override; |
| 372 | 372 |
| 373 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; | 373 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; |
| 374 | 374 |
| 375 GrDisplacementMapEffect(GrShaderDataManager*, | 375 GrDisplacementMapEffect(GrProcessorDataManager*, |
| 376 SkDisplacementMapEffect::ChannelSelectorType xChanne
lSelector, | 376 SkDisplacementMapEffect::ChannelSelectorType xChanne
lSelector, |
| 377 SkDisplacementMapEffect::ChannelSelectorType yChanne
lSelector, | 377 SkDisplacementMapEffect::ChannelSelectorType yChanne
lSelector, |
| 378 const SkVector& scale, | 378 const SkVector& scale, |
| 379 GrTexture* displacement, const SkMatrix& offsetMatri
x, | 379 GrTexture* displacement, const SkMatrix& offsetMatri
x, |
| 380 GrTexture* color, | 380 GrTexture* color, |
| 381 const SkISize& colorDimensions); | 381 const SkISize& colorDimensions); |
| 382 | 382 |
| 383 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 383 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
| 384 | 384 |
| 385 GrCoordTransform fDisplacementTransform; | 385 GrCoordTransform fDisplacementTransform; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 442 | 442 |
| 443 SkVector scale = SkVector::Make(fScale, fScale); | 443 SkVector scale = SkVector::Make(fScale, fScale); |
| 444 ctx.ctm().mapVectors(&scale, 1); | 444 ctx.ctm().mapVectors(&scale, 1); |
| 445 | 445 |
| 446 GrPaint paint; | 446 GrPaint paint; |
| 447 SkMatrix offsetMatrix = GrCoordTransform::MakeDivByTextureWHMatrix(displacem
ent); | 447 SkMatrix offsetMatrix = GrCoordTransform::MakeDivByTextureWHMatrix(displacem
ent); |
| 448 offsetMatrix.preTranslate(SkIntToScalar(colorOffset.fX - displacementOffset.
fX), | 448 offsetMatrix.preTranslate(SkIntToScalar(colorOffset.fX - displacementOffset.
fX), |
| 449 SkIntToScalar(colorOffset.fY - displacementOffset.
fY)); | 449 SkIntToScalar(colorOffset.fY - displacementOffset.
fY)); |
| 450 | 450 |
| 451 paint.addColorProcessor( | 451 paint.addColorProcessor( |
| 452 GrDisplacementMapEffect::Create(paint.getShaderDataManager(), | 452 GrDisplacementMapEffect::Create(paint.getProcessorDataManager(), |
| 453 fXChannelSelector, | 453 fXChannelSelector, |
| 454 fYChannelSelector, | 454 fYChannelSelector, |
| 455 scale, | 455 scale, |
| 456 displacement, | 456 displacement, |
| 457 offsetMatrix, | 457 offsetMatrix, |
| 458 color, | 458 color, |
| 459 colorBM.dimensions()))->unref(); | 459 colorBM.dimensions()))->unref(); |
| 460 SkIRect colorBounds = bounds; | 460 SkIRect colorBounds = bounds; |
| 461 colorBounds.offset(-colorOffset); | 461 colorBounds.offset(-colorOffset); |
| 462 SkMatrix matrix; | 462 SkMatrix matrix; |
| 463 matrix.setTranslate(-SkIntToScalar(colorBounds.x()), | 463 matrix.setTranslate(-SkIntToScalar(colorBounds.x()), |
| 464 -SkIntToScalar(colorBounds.y())); | 464 -SkIntToScalar(colorBounds.y())); |
| 465 | 465 |
| 466 GrDrawContext* drawContext = context->drawContext(); | 466 GrDrawContext* drawContext = context->drawContext(); |
| 467 if (!drawContext) { | 467 if (!drawContext) { |
| 468 return false; | 468 return false; |
| 469 } | 469 } |
| 470 | 470 |
| 471 drawContext->drawRect(dst->asRenderTarget(), GrClip::WideOpen(), paint, matr
ix, | 471 drawContext->drawRect(dst->asRenderTarget(), GrClip::WideOpen(), paint, matr
ix, |
| 472 SkRect::Make(colorBounds)); | 472 SkRect::Make(colorBounds)); |
| 473 offset->fX = bounds.left(); | 473 offset->fX = bounds.left(); |
| 474 offset->fY = bounds.top(); | 474 offset->fY = bounds.top(); |
| 475 WrapTexture(dst, bounds.width(), bounds.height(), result); | 475 WrapTexture(dst, bounds.width(), bounds.height(), result); |
| 476 return true; | 476 return true; |
| 477 } | 477 } |
| 478 | 478 |
| 479 /////////////////////////////////////////////////////////////////////////////// | 479 /////////////////////////////////////////////////////////////////////////////// |
| 480 | 480 |
| 481 GrDisplacementMapEffect::GrDisplacementMapEffect( | 481 GrDisplacementMapEffect::GrDisplacementMapEffect( |
| 482 GrShaderDataManager*, | 482 GrProcessorDataManager*, |
| 483 SkDisplacementMapEffect::ChannelSelectorType xChann
elSelector, | 483 SkDisplacementMapEffect::ChannelSelectorType xChann
elSelector, |
| 484 SkDisplacementMapEffect::ChannelSelectorType yChann
elSelector, | 484 SkDisplacementMapEffect::ChannelSelectorType yChann
elSelector, |
| 485 const SkVector& scale, | 485 const SkVector& scale, |
| 486 GrTexture* displacement, | 486 GrTexture* displacement, |
| 487 const SkMatrix& offsetMatrix, | 487 const SkMatrix& offsetMatrix, |
| 488 GrTexture* color, | 488 GrTexture* color, |
| 489 const SkISize& colorDimensions) | 489 const SkISize& colorDimensions) |
| 490 : fDisplacementTransform(kLocal_GrCoordSet, offsetMatrix, displacement, | 490 : fDisplacementTransform(kLocal_GrCoordSet, offsetMatrix, displacement, |
| 491 GrTextureParams::kNone_FilterMode) | 491 GrTextureParams::kNone_FilterMode) |
| 492 , fDisplacementAccess(displacement) | 492 , fDisplacementAccess(displacement) |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 static_cast<SkDisplacementMapEffect::ChannelSelectorType>( | 537 static_cast<SkDisplacementMapEffect::ChannelSelectorType>( |
| 538 d->fRandom->nextRangeU(1, kMaxComponent)); | 538 d->fRandom->nextRangeU(1, kMaxComponent)); |
| 539 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector = | 539 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector = |
| 540 static_cast<SkDisplacementMapEffect::ChannelSelectorType>( | 540 static_cast<SkDisplacementMapEffect::ChannelSelectorType>( |
| 541 d->fRandom->nextRangeU(1, kMaxComponent)); | 541 d->fRandom->nextRangeU(1, kMaxComponent)); |
| 542 SkVector scale = SkVector::Make(d->fRandom->nextRangeScalar(0, 100.0f), | 542 SkVector scale = SkVector::Make(d->fRandom->nextRangeScalar(0, 100.0f), |
| 543 d->fRandom->nextRangeScalar(0, 100.0f)); | 543 d->fRandom->nextRangeScalar(0, 100.0f)); |
| 544 SkISize colorDimensions; | 544 SkISize colorDimensions; |
| 545 colorDimensions.fWidth = d->fRandom->nextRangeU(0, d->fTextures[texIdxColor]
->width()); | 545 colorDimensions.fWidth = d->fRandom->nextRangeU(0, d->fTextures[texIdxColor]
->width()); |
| 546 colorDimensions.fHeight = d->fRandom->nextRangeU(0, d->fTextures[texIdxColor
]->height()); | 546 colorDimensions.fHeight = d->fRandom->nextRangeU(0, d->fTextures[texIdxColor
]->height()); |
| 547 return GrDisplacementMapEffect::Create(d->fShaderDataManager, | 547 return GrDisplacementMapEffect::Create(d->fProcDataManager, |
| 548 xChannelSelector, yChannelSelector, s
cale, | 548 xChannelSelector, yChannelSelector, s
cale, |
| 549 d->fTextures[texIdxDispl], SkMatrix::
I(), | 549 d->fTextures[texIdxDispl], SkMatrix::
I(), |
| 550 d->fTextures[texIdxColor], colorDimen
sions); | 550 d->fTextures[texIdxColor], colorDimen
sions); |
| 551 } | 551 } |
| 552 | 552 |
| 553 /////////////////////////////////////////////////////////////////////////////// | 553 /////////////////////////////////////////////////////////////////////////////// |
| 554 | 554 |
| 555 GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrProcessor& proc) | 555 GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrProcessor& proc) |
| 556 : fXChannelSelector(proc.cast<GrDisplacementMapEffect>().xChannelSelector()) | 556 : fXChannelSelector(proc.cast<GrDisplacementMapEffect>().xChannelSelector()) |
| 557 , fYChannelSelector(proc.cast<GrDisplacementMapEffect>().yChannelSelector())
{ | 557 , fYChannelSelector(proc.cast<GrDisplacementMapEffect>().yChannelSelector())
{ |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 const GrGLSLCaps&, GrProcessorKeyBuilder*
b) { | 647 const GrGLSLCaps&, GrProcessorKeyBuilder*
b) { |
| 648 const GrDisplacementMapEffect& displacementMap = proc.cast<GrDisplacementMap
Effect>(); | 648 const GrDisplacementMapEffect& displacementMap = proc.cast<GrDisplacementMap
Effect>(); |
| 649 | 649 |
| 650 uint32_t xKey = displacementMap.xChannelSelector(); | 650 uint32_t xKey = displacementMap.xChannelSelector(); |
| 651 uint32_t yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBit
s; | 651 uint32_t yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBit
s; |
| 652 | 652 |
| 653 b->add32(xKey | yKey); | 653 b->add32(xKey | yKey); |
| 654 } | 654 } |
| 655 #endif | 655 #endif |
| 656 | 656 |
| OLD | NEW |