| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "SkBitmapProcState.h" | 9 #include "SkBitmapProcState.h" |
| 10 #include "SkColor.h" | 10 #include "SkColor.h" |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 void onComputeInvariantOutput(GrInvariantOutput* inout) const override { | 284 void onComputeInvariantOutput(GrInvariantOutput* inout) const override { |
| 285 inout->mulByUnknownFourComponents(); | 285 inout->mulByUnknownFourComponents(); |
| 286 } | 286 } |
| 287 | 287 |
| 288 const SkVector3& lightDir() const { return fLightDir; } | 288 const SkVector3& lightDir() const { return fLightDir; } |
| 289 const SkColor3f& lightColor() const { return fLightColor; } | 289 const SkColor3f& lightColor() const { return fLightColor; } |
| 290 const SkColor3f& ambientColor() const { return fAmbientColor; } | 290 const SkColor3f& ambientColor() const { return fAmbientColor; } |
| 291 const SkVector& invNormRotation() const { return fInvNormRotation; } | 291 const SkVector& invNormRotation() const { return fInvNormRotation; } |
| 292 | 292 |
| 293 private: | 293 private: |
| 294 GrGLFragmentProcessor* onCreateGLInstance() const override { return SkNEW(Li
ghtingGLFP); } | 294 GrGLFragmentProcessor* onCreateGLInstance() const override { return new Ligh
tingGLFP; } |
| 295 | 295 |
| 296 bool onIsEqual(const GrFragmentProcessor& proc) const override { | 296 bool onIsEqual(const GrFragmentProcessor& proc) const override { |
| 297 const LightingFP& lightingFP = proc.cast<LightingFP>(); | 297 const LightingFP& lightingFP = proc.cast<LightingFP>(); |
| 298 return fDiffDeviceTransform == lightingFP.fDiffDeviceTransform && | 298 return fDiffDeviceTransform == lightingFP.fDiffDeviceTransform && |
| 299 fNormDeviceTransform == lightingFP.fNormDeviceTransform && | 299 fNormDeviceTransform == lightingFP.fNormDeviceTransform && |
| 300 fDiffuseTextureAccess == lightingFP.fDiffuseTextureAccess && | 300 fDiffuseTextureAccess == lightingFP.fDiffuseTextureAccess && |
| 301 fNormalTextureAccess == lightingFP.fNormalTextureAccess && | 301 fNormalTextureAccess == lightingFP.fNormalTextureAccess && |
| 302 fLightDir == lightingFP.fLightDir && | 302 fLightDir == lightingFP.fLightDir && |
| 303 fLightColor == lightingFP.fLightColor && | 303 fLightColor == lightingFP.fLightColor && |
| 304 fAmbientColor == lightingFP.fAmbientColor && | 304 fAmbientColor == lightingFP.fAmbientColor && |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 | 386 |
| 387 GrTextureParams normParams(kClamp_TileMode, normFilterMode); | 387 GrTextureParams normParams(kClamp_TileMode, normFilterMode); |
| 388 SkAutoTUnref<GrTexture> normalTexture(GrRefCachedBitmapTexture(context, | 388 SkAutoTUnref<GrTexture> normalTexture(GrRefCachedBitmapTexture(context, |
| 389 fNormalMap, &
normParams)); | 389 fNormalMap, &
normParams)); |
| 390 if (!normalTexture) { | 390 if (!normalTexture) { |
| 391 SkErrorInternals::SetError(kInternalError_SkError, | 391 SkErrorInternals::SetError(kInternalError_SkError, |
| 392 "Couldn't convert bitmap to texture."); | 392 "Couldn't convert bitmap to texture."); |
| 393 return false; | 393 return false; |
| 394 } | 394 } |
| 395 | 395 |
| 396 | 396 *fp = new LightingFP(pdm, diffuseTexture, normalTexture, diffM, normM, diffP
arams, normParams, |
| 397 *fp = SkNEW_ARGS(LightingFP, (pdm, diffuseTexture, normalTexture, | 397 fLights, fInvNormRotation); |
| 398 diffM, normM, diffParams, normParams, fLights, | |
| 399 fInvNormRotation)); | |
| 400 | 398 |
| 401 *color = GrColorPackA4(paint.getAlpha()); | 399 *color = GrColorPackA4(paint.getAlpha()); |
| 402 return true; | 400 return true; |
| 403 } | 401 } |
| 404 #else | 402 #else |
| 405 | 403 |
| 406 bool SkLightingShaderImpl::asFragmentProcessor(GrContext* context, const SkPaint
& paint, | 404 bool SkLightingShaderImpl::asFragmentProcessor(GrContext* context, const SkPaint
& paint, |
| 407 const SkMatrix& viewM, const SkMa
trix* localMatrix, | 405 const SkMatrix& viewM, const SkMa
trix* localMatrix, |
| 408 GrColor* color, GrProcessorDataMa
nager*, | 406 GrColor* color, GrProcessorDataMa
nager*, |
| 409 GrFragmentProcessor** fp) const { | 407 GrFragmentProcessor** fp) const { |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 608 SkVector3 dir; | 606 SkVector3 dir; |
| 609 if (!buf.readScalarArray(&dir.fX, 3)) { | 607 if (!buf.readScalarArray(&dir.fX, 3)) { |
| 610 return NULL; | 608 return NULL; |
| 611 } | 609 } |
| 612 builder.add(SkLight(color, dir)); | 610 builder.add(SkLight(color, dir)); |
| 613 } | 611 } |
| 614 } | 612 } |
| 615 | 613 |
| 616 SkAutoTUnref<const SkLightingShader::Lights> lights(builder.finish()); | 614 SkAutoTUnref<const SkLightingShader::Lights> lights(builder.finish()); |
| 617 | 615 |
| 618 return SkNEW_ARGS(SkLightingShaderImpl, (diffuse, normal, lights, | 616 return new SkLightingShaderImpl(diffuse, normal, lights, SkVector::Make(1.0f
, 0.0f), |
| 619 SkVector::Make(1.0f, 0.0f), | 617 &diffLocalM, &normLocalM); |
| 620 &diffLocalM, &normLocalM)); | |
| 621 } | 618 } |
| 622 | 619 |
| 623 void SkLightingShaderImpl::flatten(SkWriteBuffer& buf) const { | 620 void SkLightingShaderImpl::flatten(SkWriteBuffer& buf) const { |
| 624 this->INHERITED::flatten(buf); | 621 this->INHERITED::flatten(buf); |
| 625 | 622 |
| 626 bool hasNormLocalM = !fNormLocalMatrix.isIdentity(); | 623 bool hasNormLocalM = !fNormLocalMatrix.isIdentity(); |
| 627 buf.writeBool(hasNormLocalM); | 624 buf.writeBool(hasNormLocalM); |
| 628 if (hasNormLocalM) { | 625 if (hasNormLocalM) { |
| 629 buf.writeMatrix(fNormLocalMatrix); | 626 buf.writeMatrix(fNormLocalMatrix); |
| 630 } | 627 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 SkMatrix diffTotalInv; | 662 SkMatrix diffTotalInv; |
| 666 // computeTotalInverse was called in SkShader::createContext so we know it w
ill succeed | 663 // computeTotalInverse was called in SkShader::createContext so we know it w
ill succeed |
| 667 SkAssertResult(this->computeTotalInverse(rec, &diffTotalInv)); | 664 SkAssertResult(this->computeTotalInverse(rec, &diffTotalInv)); |
| 668 | 665 |
| 669 SkMatrix normTotalInv; | 666 SkMatrix normTotalInv; |
| 670 if (!this->computeNormTotalInverse(rec, &normTotalInv)) { | 667 if (!this->computeNormTotalInverse(rec, &normTotalInv)) { |
| 671 return NULL; | 668 return NULL; |
| 672 } | 669 } |
| 673 | 670 |
| 674 void* diffuseStateStorage = (char*)storage + sizeof(LightingShaderContext); | 671 void* diffuseStateStorage = (char*)storage + sizeof(LightingShaderContext); |
| 675 SkBitmapProcState* diffuseState = SkNEW_PLACEMENT(diffuseStateStorage, SkBit
mapProcState); | 672 SkBitmapProcState* diffuseState = new (diffuseStateStorage) SkBitmapProcStat
e; |
| 676 SkASSERT(diffuseState); | 673 SkASSERT(diffuseState); |
| 677 | 674 |
| 678 diffuseState->fTileModeX = SkShader::kClamp_TileMode; | 675 diffuseState->fTileModeX = SkShader::kClamp_TileMode; |
| 679 diffuseState->fTileModeY = SkShader::kClamp_TileMode; | 676 diffuseState->fTileModeY = SkShader::kClamp_TileMode; |
| 680 diffuseState->fOrigBitmap = fDiffuseMap; | 677 diffuseState->fOrigBitmap = fDiffuseMap; |
| 681 if (!diffuseState->chooseProcs(diffTotalInv, *rec.fPaint)) { | 678 if (!diffuseState->chooseProcs(diffTotalInv, *rec.fPaint)) { |
| 682 diffuseState->~SkBitmapProcState(); | 679 diffuseState->~SkBitmapProcState(); |
| 683 return NULL; | 680 return NULL; |
| 684 } | 681 } |
| 685 | 682 |
| 686 void* normalStateStorage = (char*)storage + sizeof(LightingShaderContext) +
sizeof(SkBitmapProcState); | 683 void* normalStateStorage = (char*)storage + sizeof(LightingShaderContext) +
sizeof(SkBitmapProcState); |
| 687 SkBitmapProcState* normalState = SkNEW_PLACEMENT(normalStateStorage, SkBitma
pProcState); | 684 SkBitmapProcState* normalState = new (normalStateStorage) SkBitmapProcState; |
| 688 SkASSERT(normalState); | 685 SkASSERT(normalState); |
| 689 | 686 |
| 690 normalState->fTileModeX = SkShader::kClamp_TileMode; | 687 normalState->fTileModeX = SkShader::kClamp_TileMode; |
| 691 normalState->fTileModeY = SkShader::kClamp_TileMode; | 688 normalState->fTileModeY = SkShader::kClamp_TileMode; |
| 692 normalState->fOrigBitmap = fNormalMap; | 689 normalState->fOrigBitmap = fNormalMap; |
| 693 if (!normalState->chooseProcs(normTotalInv, *rec.fPaint)) { | 690 if (!normalState->chooseProcs(normTotalInv, *rec.fPaint)) { |
| 694 diffuseState->~SkBitmapProcState(); | 691 diffuseState->~SkBitmapProcState(); |
| 695 normalState->~SkBitmapProcState(); | 692 normalState->~SkBitmapProcState(); |
| 696 return NULL; | 693 return NULL; |
| 697 } | 694 } |
| 698 | 695 |
| 699 return SkNEW_PLACEMENT_ARGS(storage, LightingShaderContext, (*this, rec, | 696 return new (storage) LightingShaderContext(*this, rec, diffuseState, normalS
tate); |
| 700 diffuseState, n
ormalState)); | |
| 701 } | 697 } |
| 702 | 698 |
| 703 /////////////////////////////////////////////////////////////////////////////// | 699 /////////////////////////////////////////////////////////////////////////////// |
| 704 | 700 |
| 705 static bool bitmap_is_too_big(const SkBitmap& bm) { | 701 static bool bitmap_is_too_big(const SkBitmap& bm) { |
| 706 // SkBitmapProcShader stores bitmap coordinates in a 16bit buffer, as it | 702 // SkBitmapProcShader stores bitmap coordinates in a 16bit buffer, as it |
| 707 // communicates between its matrix-proc and its sampler-proc. Until we can | 703 // communicates between its matrix-proc and its sampler-proc. Until we can |
| 708 // widen that, we have to reject bitmaps that are larger. | 704 // widen that, we have to reject bitmaps that are larger. |
| 709 // | 705 // |
| 710 static const int kMaxSize = 65535; | 706 static const int kMaxSize = 65535; |
| 711 | 707 |
| 712 return bm.width() > kMaxSize || bm.height() > kMaxSize; | 708 return bm.width() > kMaxSize || bm.height() > kMaxSize; |
| 713 } | 709 } |
| 714 | 710 |
| 715 SkShader* SkLightingShader::Create(const SkBitmap& diffuse, const SkBitmap& norm
al, | 711 SkShader* SkLightingShader::Create(const SkBitmap& diffuse, const SkBitmap& norm
al, |
| 716 const Lights* lights, | 712 const Lights* lights, |
| 717 const SkVector& invNormRotation, | 713 const SkVector& invNormRotation, |
| 718 const SkMatrix* diffLocalM, const SkMatrix* n
ormLocalM) { | 714 const SkMatrix* diffLocalM, const SkMatrix* n
ormLocalM) { |
| 719 if (diffuse.isNull() || bitmap_is_too_big(diffuse) || | 715 if (diffuse.isNull() || bitmap_is_too_big(diffuse) || |
| 720 normal.isNull() || bitmap_is_too_big(normal) || | 716 normal.isNull() || bitmap_is_too_big(normal) || |
| 721 diffuse.width() != normal.width() || | 717 diffuse.width() != normal.width() || |
| 722 diffuse.height() != normal.height()) { | 718 diffuse.height() != normal.height()) { |
| 723 return nullptr; | 719 return nullptr; |
| 724 } | 720 } |
| 725 | 721 |
| 726 SkASSERT(SkScalarNearlyEqual(invNormRotation.lengthSqd(), SK_Scalar1)); | 722 SkASSERT(SkScalarNearlyEqual(invNormRotation.lengthSqd(), SK_Scalar1)); |
| 727 | 723 |
| 728 return SkNEW_ARGS(SkLightingShaderImpl, (diffuse, normal, lights, | 724 return new SkLightingShaderImpl(diffuse, normal, lights, invNormRotation, di
ffLocalM, |
| 729 invNormRotation, diffLocalM, normLo
calM)); | 725 normLocalM); |
| 730 } | 726 } |
| 731 | 727 |
| 732 /////////////////////////////////////////////////////////////////////////////// | 728 /////////////////////////////////////////////////////////////////////////////// |
| 733 | 729 |
| 734 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingShader) | 730 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingShader) |
| 735 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingShaderImpl) | 731 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLightingShaderImpl) |
| 736 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 732 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| 737 | 733 |
| 738 /////////////////////////////////////////////////////////////////////////////// | 734 /////////////////////////////////////////////////////////////////////////////// |
| OLD | NEW |