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 SkDisplacementMapEffect::ChannelSelectorType xChannelSelector, | 336 SkDisplacementMapEffect::ChannelSelectorType xChannelSelector, |
336 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector, SkVec
tor scale, | 337 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector, SkVec
tor scale, |
337 GrTexture* displacement, const SkMatrix& offsetMatrix, GrTexture* co
lor, | 338 GrTexture* displacement, const SkMatrix& offsetMatrix, GrTexture* co
lor, |
338 const SkISize& colorDimensions) { | 339 const SkISize& colorDimensions) { |
339 return SkNEW_ARGS(GrDisplacementMapEffect, (xChannelSelector, | 340 return SkNEW_ARGS(GrDisplacementMapEffect, (shaderDataManager, |
| 341 xChannelSelector, |
340 yChannelSelector, | 342 yChannelSelector, |
341 scale, | 343 scale, |
342 displacement, | 344 displacement, |
343 offsetMatrix, | 345 offsetMatrix, |
344 color, | 346 color, |
345 colorDimensions)); | 347 colorDimensions)); |
346 } | 348 } |
347 | 349 |
348 virtual ~GrDisplacementMapEffect(); | 350 virtual ~GrDisplacementMapEffect(); |
349 | 351 |
(...skipping 13 matching lines...) Expand all Loading... |
363 const SkVector& scale() const { return fScale; } | 365 const SkVector& scale() const { return fScale; } |
364 | 366 |
365 const char* name() const override { return "DisplacementMap"; } | 367 const char* name() const override { return "DisplacementMap"; } |
366 const GrTextureDomain& domain() const { return fDomain; } | 368 const GrTextureDomain& domain() const { return fDomain; } |
367 | 369 |
368 private: | 370 private: |
369 bool onIsEqual(const GrFragmentProcessor&) const override; | 371 bool onIsEqual(const GrFragmentProcessor&) const override; |
370 | 372 |
371 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; | 373 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; |
372 | 374 |
373 GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChanne
lSelector, | 375 GrDisplacementMapEffect(GrShaderDataManager*, |
| 376 SkDisplacementMapEffect::ChannelSelectorType xChanne
lSelector, |
374 SkDisplacementMapEffect::ChannelSelectorType yChanne
lSelector, | 377 SkDisplacementMapEffect::ChannelSelectorType yChanne
lSelector, |
375 const SkVector& scale, | 378 const SkVector& scale, |
376 GrTexture* displacement, const SkMatrix& offsetMatri
x, | 379 GrTexture* displacement, const SkMatrix& offsetMatri
x, |
377 GrTexture* color, | 380 GrTexture* color, |
378 const SkISize& colorDimensions); | 381 const SkISize& colorDimensions); |
379 | 382 |
380 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 383 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
381 | 384 |
382 GrCoordTransform fDisplacementTransform; | 385 GrCoordTransform fDisplacementTransform; |
383 GrTextureAccess fDisplacementAccess; | 386 GrTextureAccess fDisplacementAccess; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 | 442 |
440 SkVector scale = SkVector::Make(fScale, fScale); | 443 SkVector scale = SkVector::Make(fScale, fScale); |
441 ctx.ctm().mapVectors(&scale, 1); | 444 ctx.ctm().mapVectors(&scale, 1); |
442 | 445 |
443 GrPaint paint; | 446 GrPaint paint; |
444 SkMatrix offsetMatrix = GrCoordTransform::MakeDivByTextureWHMatrix(displacem
ent); | 447 SkMatrix offsetMatrix = GrCoordTransform::MakeDivByTextureWHMatrix(displacem
ent); |
445 offsetMatrix.preTranslate(SkIntToScalar(colorOffset.fX - displacementOffset.
fX), | 448 offsetMatrix.preTranslate(SkIntToScalar(colorOffset.fX - displacementOffset.
fX), |
446 SkIntToScalar(colorOffset.fY - displacementOffset.
fY)); | 449 SkIntToScalar(colorOffset.fY - displacementOffset.
fY)); |
447 | 450 |
448 paint.addColorProcessor( | 451 paint.addColorProcessor( |
449 GrDisplacementMapEffect::Create(fXChannelSelector, | 452 GrDisplacementMapEffect::Create(paint.getShaderDataManager(), |
| 453 fXChannelSelector, |
450 fYChannelSelector, | 454 fYChannelSelector, |
451 scale, | 455 scale, |
452 displacement, | 456 displacement, |
453 offsetMatrix, | 457 offsetMatrix, |
454 color, | 458 color, |
455 colorBM.dimensions()))->unref(); | 459 colorBM.dimensions()))->unref(); |
456 SkIRect colorBounds = bounds; | 460 SkIRect colorBounds = bounds; |
457 colorBounds.offset(-colorOffset); | 461 colorBounds.offset(-colorOffset); |
458 SkMatrix matrix; | 462 SkMatrix matrix; |
459 matrix.setTranslate(-SkIntToScalar(colorBounds.x()), | 463 matrix.setTranslate(-SkIntToScalar(colorBounds.x()), |
460 -SkIntToScalar(colorBounds.y())); | 464 -SkIntToScalar(colorBounds.y())); |
461 | 465 |
462 GrDrawContext* drawContext = context->drawContext(); | 466 GrDrawContext* drawContext = context->drawContext(); |
463 if (!drawContext) { | 467 if (!drawContext) { |
464 return false; | 468 return false; |
465 } | 469 } |
466 | 470 |
467 drawContext->drawRect(dst->asRenderTarget(), GrClip::WideOpen(), paint, matr
ix, | 471 drawContext->drawRect(dst->asRenderTarget(), GrClip::WideOpen(), paint, matr
ix, |
468 SkRect::Make(colorBounds)); | 472 SkRect::Make(colorBounds)); |
469 offset->fX = bounds.left(); | 473 offset->fX = bounds.left(); |
470 offset->fY = bounds.top(); | 474 offset->fY = bounds.top(); |
471 WrapTexture(dst, bounds.width(), bounds.height(), result); | 475 WrapTexture(dst, bounds.width(), bounds.height(), result); |
472 return true; | 476 return true; |
473 } | 477 } |
474 | 478 |
475 /////////////////////////////////////////////////////////////////////////////// | 479 /////////////////////////////////////////////////////////////////////////////// |
476 | 480 |
477 GrDisplacementMapEffect::GrDisplacementMapEffect( | 481 GrDisplacementMapEffect::GrDisplacementMapEffect( |
| 482 GrShaderDataManager*, |
478 SkDisplacementMapEffect::ChannelSelectorType xChann
elSelector, | 483 SkDisplacementMapEffect::ChannelSelectorType xChann
elSelector, |
479 SkDisplacementMapEffect::ChannelSelectorType yChann
elSelector, | 484 SkDisplacementMapEffect::ChannelSelectorType yChann
elSelector, |
480 const SkVector& scale, | 485 const SkVector& scale, |
481 GrTexture* displacement, | 486 GrTexture* displacement, |
482 const SkMatrix& offsetMatrix, | 487 const SkMatrix& offsetMatrix, |
483 GrTexture* color, | 488 GrTexture* color, |
484 const SkISize& colorDimensions) | 489 const SkISize& colorDimensions) |
485 : fDisplacementTransform(kLocal_GrCoordSet, offsetMatrix, displacement, | 490 : fDisplacementTransform(kLocal_GrCoordSet, offsetMatrix, displacement, |
486 GrTextureParams::kNone_FilterMode) | 491 GrTextureParams::kNone_FilterMode) |
487 , fDisplacementAccess(displacement) | 492 , fDisplacementAccess(displacement) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 static_cast<SkDisplacementMapEffect::ChannelSelectorType>( | 540 static_cast<SkDisplacementMapEffect::ChannelSelectorType>( |
536 random->nextRangeU(1, kMaxComponent)); | 541 random->nextRangeU(1, kMaxComponent)); |
537 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector = | 542 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector = |
538 static_cast<SkDisplacementMapEffect::ChannelSelectorType>( | 543 static_cast<SkDisplacementMapEffect::ChannelSelectorType>( |
539 random->nextRangeU(1, kMaxComponent)); | 544 random->nextRangeU(1, kMaxComponent)); |
540 SkVector scale = SkVector::Make(random->nextRangeScalar(0, 100.0f), | 545 SkVector scale = SkVector::Make(random->nextRangeScalar(0, 100.0f), |
541 random->nextRangeScalar(0, 100.0f)); | 546 random->nextRangeScalar(0, 100.0f)); |
542 SkISize colorDimensions; | 547 SkISize colorDimensions; |
543 colorDimensions.fWidth = random->nextRangeU(0, textures[texIdxColor]->width(
)); | 548 colorDimensions.fWidth = random->nextRangeU(0, textures[texIdxColor]->width(
)); |
544 colorDimensions.fHeight = random->nextRangeU(0, textures[texIdxColor]->heigh
t()); | 549 colorDimensions.fHeight = random->nextRangeU(0, textures[texIdxColor]->heigh
t()); |
545 return GrDisplacementMapEffect::Create(xChannelSelector, yChannelSelector, s
cale, | 550 GrShaderDataManager shaderDataManager; |
| 551 return GrDisplacementMapEffect::Create(&shaderDataManager, |
| 552 xChannelSelector, yChannelSelector, s
cale, |
546 textures[texIdxDispl], SkMatrix::I(), | 553 textures[texIdxDispl], SkMatrix::I(), |
547 textures[texIdxColor], colorDimension
s); | 554 textures[texIdxColor], colorDimension
s); |
548 } | 555 } |
549 | 556 |
550 /////////////////////////////////////////////////////////////////////////////// | 557 /////////////////////////////////////////////////////////////////////////////// |
551 | 558 |
552 GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrProcessor& proc) | 559 GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrProcessor& proc) |
553 : fXChannelSelector(proc.cast<GrDisplacementMapEffect>().xChannelSelector()) | 560 : fXChannelSelector(proc.cast<GrDisplacementMapEffect>().xChannelSelector()) |
554 , fYChannelSelector(proc.cast<GrDisplacementMapEffect>().yChannelSelector())
{ | 561 , fYChannelSelector(proc.cast<GrDisplacementMapEffect>().yChannelSelector())
{ |
555 } | 562 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 const GrGLSLCaps&, GrProcessorKeyBuilder*
b) { | 651 const GrGLSLCaps&, GrProcessorKeyBuilder*
b) { |
645 const GrDisplacementMapEffect& displacementMap = proc.cast<GrDisplacementMap
Effect>(); | 652 const GrDisplacementMapEffect& displacementMap = proc.cast<GrDisplacementMap
Effect>(); |
646 | 653 |
647 uint32_t xKey = displacementMap.xChannelSelector(); | 654 uint32_t xKey = displacementMap.xChannelSelector(); |
648 uint32_t yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBit
s; | 655 uint32_t yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBit
s; |
649 | 656 |
650 b->add32(xKey | yKey); | 657 b->add32(xKey | yKey); |
651 } | 658 } |
652 #endif | 659 #endif |
653 | 660 |
OLD | NEW |