| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2010 Google Inc. | 2 * Copyright 2010 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 | 8 |
| 9 #include "SkGr.h" | 9 #include "SkGr.h" |
| 10 #include "SkGrPriv.h" | 10 #include "SkGrPriv.h" |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 return SkXfermode::kDst_Mode != mode; | 488 return SkXfermode::kDst_Mode != mode; |
| 489 } | 489 } |
| 490 } | 490 } |
| 491 | 491 |
| 492 static inline bool skpaint_to_grpaint_impl(GrContext* context, | 492 static inline bool skpaint_to_grpaint_impl(GrContext* context, |
| 493 const SkPaint& skPaint, | 493 const SkPaint& skPaint, |
| 494 const SkMatrix& viewM, | 494 const SkMatrix& viewM, |
| 495 const GrFragmentProcessor** shaderPro
cessor, | 495 const GrFragmentProcessor** shaderPro
cessor, |
| 496 SkXfermode::Mode* primColorMode, | 496 SkXfermode::Mode* primColorMode, |
| 497 bool primitiveIsSrc, | 497 bool primitiveIsSrc, |
| 498 bool allowSRGBInputs, |
| 498 GrPaint* grPaint) { | 499 GrPaint* grPaint) { |
| 499 grPaint->setAntiAlias(skPaint.isAntiAlias()); | 500 grPaint->setAntiAlias(skPaint.isAntiAlias()); |
| 501 grPaint->setAllowSRGBInputs(allowSRGBInputs); |
| 500 | 502 |
| 501 // Setup the initial color considering the shader, the SkPaint color, and th
e presence or not | 503 // Setup the initial color considering the shader, the SkPaint color, and th
e presence or not |
| 502 // of per-vertex colors. | 504 // of per-vertex colors. |
| 503 SkAutoTUnref<const GrFragmentProcessor> aufp; | 505 SkAutoTUnref<const GrFragmentProcessor> aufp; |
| 504 const GrFragmentProcessor* shaderFP = nullptr; | 506 const GrFragmentProcessor* shaderFP = nullptr; |
| 505 if (!primColorMode || blend_requires_shader(*primColorMode, primitiveIsSrc))
{ | 507 if (!primColorMode || blend_requires_shader(*primColorMode, primitiveIsSrc))
{ |
| 506 if (shaderProcessor) { | 508 if (shaderProcessor) { |
| 507 shaderFP = *shaderProcessor; | 509 shaderFP = *shaderProcessor; |
| 508 } else if (const SkShader* shader = skPaint.getShader()) { | 510 } else if (const SkShader* shader = skPaint.getShader()) { |
| 509 aufp.reset(shader->asFragmentProcessor(context, viewM, nullptr, | 511 aufp.reset(shader->asFragmentProcessor(context, viewM, nullptr, |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 | 618 |
| 617 #ifndef SK_IGNORE_GPU_DITHER | 619 #ifndef SK_IGNORE_GPU_DITHER |
| 618 if (skPaint.isDither() && grPaint->numColorFragmentProcessors() > 0) { | 620 if (skPaint.isDither() && grPaint->numColorFragmentProcessors() > 0) { |
| 619 grPaint->addColorFragmentProcessor(GrDitherEffect::Create())->unref(); | 621 grPaint->addColorFragmentProcessor(GrDitherEffect::Create())->unref(); |
| 620 } | 622 } |
| 621 #endif | 623 #endif |
| 622 return true; | 624 return true; |
| 623 } | 625 } |
| 624 | 626 |
| 625 bool SkPaintToGrPaint(GrContext* context, const SkPaint& skPaint, const SkMatrix
& viewM, | 627 bool SkPaintToGrPaint(GrContext* context, const SkPaint& skPaint, const SkMatrix
& viewM, |
| 626 GrPaint* grPaint) { | 628 bool allowSRGBInputs, GrPaint* grPaint) { |
| 627 return skpaint_to_grpaint_impl(context, skPaint, viewM, nullptr, nullptr, fa
lse, grPaint); | 629 return skpaint_to_grpaint_impl(context, skPaint, viewM, nullptr, nullptr, fa
lse, |
| 630 allowSRGBInputs, grPaint); |
| 628 } | 631 } |
| 629 | 632 |
| 630 /** Replaces the SkShader (if any) on skPaint with the passed in GrFragmentProce
ssor. */ | 633 /** Replaces the SkShader (if any) on skPaint with the passed in GrFragmentProce
ssor. */ |
| 631 bool SkPaintToGrPaintReplaceShader(GrContext* context, | 634 bool SkPaintToGrPaintReplaceShader(GrContext* context, |
| 632 const SkPaint& skPaint, | 635 const SkPaint& skPaint, |
| 633 const GrFragmentProcessor* shaderFP, | 636 const GrFragmentProcessor* shaderFP, |
| 637 bool allowSRGBInputs, |
| 634 GrPaint* grPaint) { | 638 GrPaint* grPaint) { |
| 635 if (!shaderFP) { | 639 if (!shaderFP) { |
| 636 return false; | 640 return false; |
| 637 } | 641 } |
| 638 return skpaint_to_grpaint_impl(context, skPaint, SkMatrix::I(), &shaderFP, n
ullptr, false, | 642 return skpaint_to_grpaint_impl(context, skPaint, SkMatrix::I(), &shaderFP, n
ullptr, false, |
| 639 grPaint); | 643 allowSRGBInputs, grPaint); |
| 640 } | 644 } |
| 641 | 645 |
| 642 /** Ignores the SkShader (if any) on skPaint. */ | 646 /** Ignores the SkShader (if any) on skPaint. */ |
| 643 bool SkPaintToGrPaintNoShader(GrContext* context, | 647 bool SkPaintToGrPaintNoShader(GrContext* context, |
| 644 const SkPaint& skPaint, | 648 const SkPaint& skPaint, |
| 649 bool allowSRGBInputs, |
| 645 GrPaint* grPaint) { | 650 GrPaint* grPaint) { |
| 646 // Use a ptr to a nullptr to to indicate that the SkShader is ignored and no
t replaced. | 651 // Use a ptr to a nullptr to to indicate that the SkShader is ignored and no
t replaced. |
| 647 static const GrFragmentProcessor* kNullShaderFP = nullptr; | 652 static const GrFragmentProcessor* kNullShaderFP = nullptr; |
| 648 static const GrFragmentProcessor** kIgnoreShader = &kNullShaderFP; | 653 static const GrFragmentProcessor** kIgnoreShader = &kNullShaderFP; |
| 649 return skpaint_to_grpaint_impl(context, skPaint, SkMatrix::I(), kIgnoreShade
r, nullptr, false, | 654 return skpaint_to_grpaint_impl(context, skPaint, SkMatrix::I(), kIgnoreShade
r, nullptr, false, |
| 650 grPaint); | 655 allowSRGBInputs, grPaint); |
| 651 } | 656 } |
| 652 | 657 |
| 653 /** Blends the SkPaint's shader (or color if no shader) with a per-primitive col
or which must | 658 /** Blends the SkPaint's shader (or color if no shader) with a per-primitive col
or which must |
| 654 be setup as a vertex attribute using the specified SkXfermode::Mode. */ | 659 be setup as a vertex attribute using the specified SkXfermode::Mode. */ |
| 655 bool SkPaintToGrPaintWithXfermode(GrContext* context, | 660 bool SkPaintToGrPaintWithXfermode(GrContext* context, |
| 656 const SkPaint& skPaint, | 661 const SkPaint& skPaint, |
| 657 const SkMatrix& viewM, | 662 const SkMatrix& viewM, |
| 658 SkXfermode::Mode primColorMode, | 663 SkXfermode::Mode primColorMode, |
| 659 bool primitiveIsSrc, | 664 bool primitiveIsSrc, |
| 665 bool allowSRGBInputs, |
| 660 GrPaint* grPaint) { | 666 GrPaint* grPaint) { |
| 661 return skpaint_to_grpaint_impl(context, skPaint, viewM, nullptr, &primColorM
ode, primitiveIsSrc, | 667 return skpaint_to_grpaint_impl(context, skPaint, viewM, nullptr, &primColorM
ode, primitiveIsSrc, |
| 662 grPaint); | 668 allowSRGBInputs, grPaint); |
| 663 } | 669 } |
| 664 | 670 |
| 665 bool SkPaintToGrPaintWithTexture(GrContext* context, | 671 bool SkPaintToGrPaintWithTexture(GrContext* context, |
| 666 const SkPaint& paint, | 672 const SkPaint& paint, |
| 667 const SkMatrix& viewM, | 673 const SkMatrix& viewM, |
| 668 const GrFragmentProcessor* fp, | 674 const GrFragmentProcessor* fp, |
| 669 bool textureIsAlphaOnly, | 675 bool textureIsAlphaOnly, |
| 676 bool allowSRGBInputs, |
| 670 GrPaint* grPaint) { | 677 GrPaint* grPaint) { |
| 671 SkAutoTUnref<const GrFragmentProcessor> shaderFP; | 678 SkAutoTUnref<const GrFragmentProcessor> shaderFP; |
| 672 if (textureIsAlphaOnly) { | 679 if (textureIsAlphaOnly) { |
| 673 if (const SkShader* shader = paint.getShader()) { | 680 if (const SkShader* shader = paint.getShader()) { |
| 674 shaderFP.reset(shader->asFragmentProcessor(context, | 681 shaderFP.reset(shader->asFragmentProcessor(context, |
| 675 viewM, | 682 viewM, |
| 676 nullptr, | 683 nullptr, |
| 677 paint.getFilterQuality())
); | 684 paint.getFilterQuality())
); |
| 678 if (!shaderFP) { | 685 if (!shaderFP) { |
| 679 return false; | 686 return false; |
| 680 } | 687 } |
| 681 const GrFragmentProcessor* fpSeries[] = { shaderFP.get(), fp }; | 688 const GrFragmentProcessor* fpSeries[] = { shaderFP.get(), fp }; |
| 682 shaderFP.reset(GrFragmentProcessor::RunInSeries(fpSeries, 2)); | 689 shaderFP.reset(GrFragmentProcessor::RunInSeries(fpSeries, 2)); |
| 683 } else { | 690 } else { |
| 684 shaderFP.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp
)); | 691 shaderFP.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp
)); |
| 685 } | 692 } |
| 686 } else { | 693 } else { |
| 687 shaderFP.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); | 694 shaderFP.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); |
| 688 } | 695 } |
| 689 | 696 |
| 690 return SkPaintToGrPaintReplaceShader(context, paint, shaderFP.get(), grPaint
); | 697 return SkPaintToGrPaintReplaceShader(context, paint, shaderFP.get(), allowSR
GBInputs, grPaint); |
| 691 } | 698 } |
| 692 | 699 |
| 693 | 700 |
| 694 ////////////////////////////////////////////////////////////////////////////////
//////////////// | 701 ////////////////////////////////////////////////////////////////////////////////
//////////////// |
| 695 | 702 |
| 696 SkImageInfo GrMakeInfoFromTexture(GrTexture* tex, int w, int h, bool isOpaque) { | 703 SkImageInfo GrMakeInfoFromTexture(GrTexture* tex, int w, int h, bool isOpaque) { |
| 697 #ifdef SK_DEBUG | 704 #ifdef SK_DEBUG |
| 698 const GrSurfaceDesc& desc = tex->desc(); | 705 const GrSurfaceDesc& desc = tex->desc(); |
| 699 SkASSERT(w <= desc.fWidth); | 706 SkASSERT(w <= desc.fWidth); |
| 700 SkASSERT(h <= desc.fHeight); | 707 SkASSERT(h <= desc.fHeight); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 749 SkErrorInternals::SetError( kInvalidPaint_SkError, | 756 SkErrorInternals::SetError( kInvalidPaint_SkError, |
| 750 "Sorry, I don't understand the filtering
" | 757 "Sorry, I don't understand the filtering
" |
| 751 "mode you asked for. Falling back to " | 758 "mode you asked for. Falling back to " |
| 752 "MIPMaps."); | 759 "MIPMaps."); |
| 753 textureFilterMode = GrTextureParams::kMipMap_FilterMode; | 760 textureFilterMode = GrTextureParams::kMipMap_FilterMode; |
| 754 break; | 761 break; |
| 755 | 762 |
| 756 } | 763 } |
| 757 return textureFilterMode; | 764 return textureFilterMode; |
| 758 } | 765 } |
| OLD | NEW |