| 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" |
| 11 #include "SkUnPreMultiply.h" | 11 #include "SkUnPreMultiply.h" |
| 12 #include "SkColorPriv.h" | 12 #include "SkColorPriv.h" |
| 13 #if SK_SUPPORT_GPU | 13 #if SK_SUPPORT_GPU |
| 14 #include "GrContext.h" | 14 #include "GrContext.h" |
| 15 #include "GrCoordTransform.h" | 15 #include "GrCoordTransform.h" |
| 16 #include "GrInvariantOutput.h" | 16 #include "GrInvariantOutput.h" |
| 17 #include "gl/GrGLProcessor.h" | 17 #include "gl/GrGLProcessor.h" |
| 18 #include "gl/builders/GrGLProgramBuilder.h" | 18 #include "gl/builders/GrGLProgramBuilder.h" |
| 19 #include "GrTBackendProcessorFactory.h" | |
| 20 #endif | 19 #endif |
| 21 | 20 |
| 22 namespace { | 21 namespace { |
| 23 | 22 |
| 24 #define kChannelSelectorKeyBits 3; // Max value is 4, so 3 bits are required at
most | 23 #define kChannelSelectorKeyBits 3; // Max value is 4, so 3 bits are required at
most |
| 25 | 24 |
| 26 template<SkDisplacementMapEffect::ChannelSelectorType type> | 25 template<SkDisplacementMapEffect::ChannelSelectorType type> |
| 27 uint32_t getValue(SkColor, const SkUnPreMultiply::Scale*) { | 26 uint32_t getValue(SkColor, const SkUnPreMultiply::Scale*) { |
| 28 SkDEBUGFAIL("Unknown channel selector"); | 27 SkDEBUGFAIL("Unknown channel selector"); |
| 29 return 0; | 28 return 0; |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 } | 279 } |
| 281 *dst = bounds; | 280 *dst = bounds; |
| 282 return true; | 281 return true; |
| 283 } | 282 } |
| 284 | 283 |
| 285 /////////////////////////////////////////////////////////////////////////////// | 284 /////////////////////////////////////////////////////////////////////////////// |
| 286 | 285 |
| 287 #if SK_SUPPORT_GPU | 286 #if SK_SUPPORT_GPU |
| 288 class GrGLDisplacementMapEffect : public GrGLFragmentProcessor { | 287 class GrGLDisplacementMapEffect : public GrGLFragmentProcessor { |
| 289 public: | 288 public: |
| 290 GrGLDisplacementMapEffect(const GrBackendProcessorFactory&, | 289 GrGLDisplacementMapEffect(const GrProcessor&); |
| 291 const GrProcessor&); | |
| 292 virtual ~GrGLDisplacementMapEffect(); | 290 virtual ~GrGLDisplacementMapEffect(); |
| 293 | 291 |
| 294 virtual void emitCode(GrGLFPBuilder*, | 292 virtual void emitCode(GrGLFPBuilder*, |
| 295 const GrFragmentProcessor&, | 293 const GrFragmentProcessor&, |
| 296 const char* outputColor, | 294 const char* outputColor, |
| 297 const char* inputColor, | 295 const char* inputColor, |
| 298 const TransformedCoordsArray&, | 296 const TransformedCoordsArray&, |
| 299 const TextureSamplerArray&) SK_OVERRIDE; | 297 const TextureSamplerArray&) SK_OVERRIDE; |
| 300 | 298 |
| 301 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); | 299 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 321 return SkNEW_ARGS(GrDisplacementMapEffect, (xChannelSelector, | 319 return SkNEW_ARGS(GrDisplacementMapEffect, (xChannelSelector, |
| 322 yChannelSelector, | 320 yChannelSelector, |
| 323 scale, | 321 scale, |
| 324 displacement, | 322 displacement, |
| 325 offsetMatrix, | 323 offsetMatrix, |
| 326 color)); | 324 color)); |
| 327 } | 325 } |
| 328 | 326 |
| 329 virtual ~GrDisplacementMapEffect(); | 327 virtual ~GrDisplacementMapEffect(); |
| 330 | 328 |
| 331 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE; | 329 virtual void getGLProcessorKey(const GrGLCaps& caps, |
| 330 GrProcessorKeyBuilder* b) const SK_OVERRIDE { |
| 331 GrGLDisplacementMapEffect::GenKey(*this, caps, b); |
| 332 } |
| 333 |
| 334 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE { |
| 335 return SkNEW_ARGS(GrGLDisplacementMapEffect, (*this)); |
| 336 } |
| 337 |
| 332 SkDisplacementMapEffect::ChannelSelectorType xChannelSelector() const | 338 SkDisplacementMapEffect::ChannelSelectorType xChannelSelector() const |
| 333 { return fXChannelSelector; } | 339 { return fXChannelSelector; } |
| 334 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector() const | 340 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector() const |
| 335 { return fYChannelSelector; } | 341 { return fYChannelSelector; } |
| 336 const SkVector& scale() const { return fScale; } | 342 const SkVector& scale() const { return fScale; } |
| 337 | 343 |
| 338 typedef GrGLDisplacementMapEffect GLProcessor; | 344 virtual const char* name() const SK_OVERRIDE { return "DisplacementMap"; } |
| 339 static const char* Name() { return "DisplacementMap"; } | |
| 340 | 345 |
| 341 private: | 346 private: |
| 342 virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE; | 347 virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE; |
| 343 | 348 |
| 344 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; | 349 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; |
| 345 | 350 |
| 346 GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChanne
lSelector, | 351 GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChanne
lSelector, |
| 347 SkDisplacementMapEffect::ChannelSelectorType yChanne
lSelector, | 352 SkDisplacementMapEffect::ChannelSelectorType yChanne
lSelector, |
| 348 const SkVector& scale, | 353 const SkVector& scale, |
| 349 GrTexture* displacement, const SkMatrix& offsetMatri
x, | 354 GrTexture* displacement, const SkMatrix& offsetMatri
x, |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 GrTexture* displacement, | 454 GrTexture* displacement, |
| 450 const SkMatrix& offsetMatrix, | 455 const SkMatrix& offsetMatrix, |
| 451 GrTexture* color) | 456 GrTexture* color) |
| 452 : fDisplacementTransform(kLocal_GrCoordSet, offsetMatrix, displacement) | 457 : fDisplacementTransform(kLocal_GrCoordSet, offsetMatrix, displacement) |
| 453 , fDisplacementAccess(displacement) | 458 , fDisplacementAccess(displacement) |
| 454 , fColorTransform(kLocal_GrCoordSet, color) | 459 , fColorTransform(kLocal_GrCoordSet, color) |
| 455 , fColorAccess(color) | 460 , fColorAccess(color) |
| 456 , fXChannelSelector(xChannelSelector) | 461 , fXChannelSelector(xChannelSelector) |
| 457 , fYChannelSelector(yChannelSelector) | 462 , fYChannelSelector(yChannelSelector) |
| 458 , fScale(scale) { | 463 , fScale(scale) { |
| 464 this->initClassID<GrDisplacementMapEffect>(); |
| 459 this->addCoordTransform(&fDisplacementTransform); | 465 this->addCoordTransform(&fDisplacementTransform); |
| 460 this->addTextureAccess(&fDisplacementAccess); | 466 this->addTextureAccess(&fDisplacementAccess); |
| 461 this->addCoordTransform(&fColorTransform); | 467 this->addCoordTransform(&fColorTransform); |
| 462 this->addTextureAccess(&fColorAccess); | 468 this->addTextureAccess(&fColorAccess); |
| 463 } | 469 } |
| 464 | 470 |
| 465 GrDisplacementMapEffect::~GrDisplacementMapEffect() { | 471 GrDisplacementMapEffect::~GrDisplacementMapEffect() { |
| 466 } | 472 } |
| 467 | 473 |
| 468 bool GrDisplacementMapEffect::onIsEqual(const GrFragmentProcessor& sBase) const
{ | 474 bool GrDisplacementMapEffect::onIsEqual(const GrFragmentProcessor& sBase) const
{ |
| 469 const GrDisplacementMapEffect& s = sBase.cast<GrDisplacementMapEffect>(); | 475 const GrDisplacementMapEffect& s = sBase.cast<GrDisplacementMapEffect>(); |
| 470 return fXChannelSelector == s.fXChannelSelector && | 476 return fXChannelSelector == s.fXChannelSelector && |
| 471 fYChannelSelector == s.fYChannelSelector && | 477 fYChannelSelector == s.fYChannelSelector && |
| 472 fScale == s.fScale; | 478 fScale == s.fScale; |
| 473 } | 479 } |
| 474 | 480 |
| 475 const GrBackendFragmentProcessorFactory& GrDisplacementMapEffect::getFactory() c
onst { | |
| 476 return GrTBackendFragmentProcessorFactory<GrDisplacementMapEffect>::getInsta
nce(); | |
| 477 } | |
| 478 | |
| 479 void GrDisplacementMapEffect::onComputeInvariantOutput(GrInvariantOutput* inout)
const { | 481 void GrDisplacementMapEffect::onComputeInvariantOutput(GrInvariantOutput* inout)
const { |
| 480 // Any displacement offset bringing a pixel out of bounds will output a colo
r of (0,0,0,0), | 482 // Any displacement offset bringing a pixel out of bounds will output a colo
r of (0,0,0,0), |
| 481 // so the only way we'd get a constant alpha is if the input color image has
a constant alpha | 483 // so the only way we'd get a constant alpha is if the input color image has
a constant alpha |
| 482 // and no displacement offset push any texture coordinates out of bounds OR
if the constant | 484 // and no displacement offset push any texture coordinates out of bounds OR
if the constant |
| 483 // alpha is 0. Since this isn't trivial to compute at this point, let's assu
me the output is | 485 // alpha is 0. Since this isn't trivial to compute at this point, let's assu
me the output is |
| 484 // not of constant color when a displacement effect is applied. | 486 // not of constant color when a displacement effect is applied. |
| 485 inout->setToUnknown(GrInvariantOutput::kWillNot_ReadInput); | 487 inout->setToUnknown(GrInvariantOutput::kWillNot_ReadInput); |
| 486 } | 488 } |
| 487 | 489 |
| 488 /////////////////////////////////////////////////////////////////////////////// | 490 /////////////////////////////////////////////////////////////////////////////// |
| (...skipping 18 matching lines...) Expand all Loading... |
| 507 SkVector scale = SkVector::Make(random->nextRangeScalar(0, 100.0f), | 509 SkVector scale = SkVector::Make(random->nextRangeScalar(0, 100.0f), |
| 508 random->nextRangeScalar(0, 100.0f)); | 510 random->nextRangeScalar(0, 100.0f)); |
| 509 | 511 |
| 510 return GrDisplacementMapEffect::Create(xChannelSelector, yChannelSelector, s
cale, | 512 return GrDisplacementMapEffect::Create(xChannelSelector, yChannelSelector, s
cale, |
| 511 textures[texIdxDispl], SkMatrix::I(), | 513 textures[texIdxDispl], SkMatrix::I(), |
| 512 textures[texIdxColor]); | 514 textures[texIdxColor]); |
| 513 } | 515 } |
| 514 | 516 |
| 515 /////////////////////////////////////////////////////////////////////////////// | 517 /////////////////////////////////////////////////////////////////////////////// |
| 516 | 518 |
| 517 GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrBackendProcessorFac
tory& factory, | 519 GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrProcessor& proc) |
| 518 const GrProcessor& proc) | 520 : fXChannelSelector(proc.cast<GrDisplacementMapEffect>().xChannelSelector()) |
| 519 : INHERITED(factory) | |
| 520 , fXChannelSelector(proc.cast<GrDisplacementMapEffect>().xChannelSelector()) | |
| 521 , fYChannelSelector(proc.cast<GrDisplacementMapEffect>().yChannelSelector())
{ | 521 , fYChannelSelector(proc.cast<GrDisplacementMapEffect>().yChannelSelector())
{ |
| 522 } | 522 } |
| 523 | 523 |
| 524 GrGLDisplacementMapEffect::~GrGLDisplacementMapEffect() { | 524 GrGLDisplacementMapEffect::~GrGLDisplacementMapEffect() { |
| 525 } | 525 } |
| 526 | 526 |
| 527 void GrGLDisplacementMapEffect::emitCode(GrGLFPBuilder* builder, | 527 void GrGLDisplacementMapEffect::emitCode(GrGLFPBuilder* builder, |
| 528 const GrFragmentProcessor&, | 528 const GrFragmentProcessor&, |
| 529 const char* outputColor, | 529 const char* outputColor, |
| 530 const char* inputColor, | 530 const char* inputColor, |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 615 void GrGLDisplacementMapEffect::GenKey(const GrProcessor& proc, | 615 void GrGLDisplacementMapEffect::GenKey(const GrProcessor& proc, |
| 616 const GrGLCaps&, GrProcessorKeyBuilder* b
) { | 616 const GrGLCaps&, GrProcessorKeyBuilder* b
) { |
| 617 const GrDisplacementMapEffect& displacementMap = proc.cast<GrDisplacementMap
Effect>(); | 617 const GrDisplacementMapEffect& displacementMap = proc.cast<GrDisplacementMap
Effect>(); |
| 618 | 618 |
| 619 uint32_t xKey = displacementMap.xChannelSelector(); | 619 uint32_t xKey = displacementMap.xChannelSelector(); |
| 620 uint32_t yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBit
s; | 620 uint32_t yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBit
s; |
| 621 | 621 |
| 622 b->add32(xKey | yKey); | 622 b->add32(xKey | yKey); |
| 623 } | 623 } |
| 624 #endif | 624 #endif |
| OLD | NEW |