| 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 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 if (primitiveIsSrc) { | 499 if (primitiveIsSrc) { |
| 500 return SkXfermode::kSrc_Mode != mode; | 500 return SkXfermode::kSrc_Mode != mode; |
| 501 } else { | 501 } else { |
| 502 return SkXfermode::kDst_Mode != mode; | 502 return SkXfermode::kDst_Mode != mode; |
| 503 } | 503 } |
| 504 } | 504 } |
| 505 | 505 |
| 506 static inline bool skpaint_to_grpaint_impl(GrContext* context, | 506 static inline bool skpaint_to_grpaint_impl(GrContext* context, |
| 507 const SkPaint& skPaint, | 507 const SkPaint& skPaint, |
| 508 const SkMatrix& viewM, | 508 const SkMatrix& viewM, |
| 509 const GrFragmentProcessor** shaderPro
cessor, | 509 sk_sp<GrFragmentProcessor>* shaderPro
cessor, |
| 510 SkXfermode::Mode* primColorMode, | 510 SkXfermode::Mode* primColorMode, |
| 511 bool primitiveIsSrc, | 511 bool primitiveIsSrc, |
| 512 bool allowSRGBInputs, | 512 bool allowSRGBInputs, |
| 513 GrPaint* grPaint) { | 513 GrPaint* grPaint) { |
| 514 grPaint->setAntiAlias(skPaint.isAntiAlias()); | 514 grPaint->setAntiAlias(skPaint.isAntiAlias()); |
| 515 grPaint->setAllowSRGBInputs(allowSRGBInputs); | 515 grPaint->setAllowSRGBInputs(allowSRGBInputs); |
| 516 | 516 |
| 517 // Setup the initial color considering the shader, the SkPaint color, and th
e presence or not | 517 // Setup the initial color considering the shader, the SkPaint color, and th
e presence or not |
| 518 // of per-vertex colors. | 518 // of per-vertex colors. |
| 519 SkAutoTUnref<const GrFragmentProcessor> aufp; | 519 sk_sp<GrFragmentProcessor> shaderFP; |
| 520 const GrFragmentProcessor* shaderFP = nullptr; | |
| 521 if (!primColorMode || blend_requires_shader(*primColorMode, primitiveIsSrc))
{ | 520 if (!primColorMode || blend_requires_shader(*primColorMode, primitiveIsSrc))
{ |
| 522 if (shaderProcessor) { | 521 if (shaderProcessor) { |
| 523 shaderFP = *shaderProcessor; | 522 shaderFP = *shaderProcessor; |
| 524 } else if (const SkShader* shader = skPaint.getShader()) { | 523 } else if (const SkShader* shader = skPaint.getShader()) { |
| 525 SkSourceGammaTreatment gammaTreatment = allowSRGBInputs | 524 SkSourceGammaTreatment gammaTreatment = allowSRGBInputs |
| 526 ? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIg
nore; | 525 ? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIg
nore; |
| 527 aufp.reset(shader->asFragmentProcessor(context, viewM, nullptr, | 526 shaderFP = shader->asFragmentProcessor(context, viewM, nullptr, |
| 528 skPaint.getFilterQuality(), g
ammaTreatment)); | 527 skPaint.getFilterQuality(), g
ammaTreatment); |
| 529 shaderFP = aufp; | |
| 530 if (!shaderFP) { | 528 if (!shaderFP) { |
| 531 return false; | 529 return false; |
| 532 } | 530 } |
| 533 } | 531 } |
| 534 } | 532 } |
| 535 | 533 |
| 536 // Set this in below cases if the output of the shader/paint-color/paint-alp
ha/primXfermode is | 534 // Set this in below cases if the output of the shader/paint-color/paint-alp
ha/primXfermode is |
| 537 // a known constant value. In that case we can simply apply a color filter d
uring this | 535 // a known constant value. In that case we can simply apply a color filter d
uring this |
| 538 // conversion without converting the color filter to a GrFragmentProcessor. | 536 // conversion without converting the color filter to a GrFragmentProcessor. |
| 539 bool applyColorFilterToPaintColor = false; | 537 bool applyColorFilterToPaintColor = false; |
| 540 if (shaderFP) { | 538 if (shaderFP) { |
| 541 if (primColorMode) { | 539 if (primColorMode) { |
| 542 // There is a blend between the primitive color and the shader color
. The shader sees | 540 // There is a blend between the primitive color and the shader color
. The shader sees |
| 543 // the opaque paint color. The shader's output is blended using the
provided mode by | 541 // the opaque paint color. The shader's output is blended using the
provided mode by |
| 544 // the primitive color. The blended color is then modulated by the p
aint's alpha. | 542 // the primitive color. The blended color is then modulated by the p
aint's alpha. |
| 545 | 543 |
| 546 // The geometry processor will insert the primitive color to start t
he color chain, so | 544 // The geometry processor will insert the primitive color to start t
he color chain, so |
| 547 // the GrPaint color will be ignored. | 545 // the GrPaint color will be ignored. |
| 548 | 546 |
| 549 GrColor shaderInput = SkColorToOpaqueGrColor(skPaint.getColor()); | 547 GrColor shaderInput = SkColorToOpaqueGrColor(skPaint.getColor()); |
| 550 | 548 |
| 551 shaderFP = GrFragmentProcessor::OverrideInput(shaderFP, shaderInput)
; | 549 shaderFP = GrFragmentProcessor::OverrideInput(shaderFP, shaderInput)
; |
| 552 aufp.reset(shaderFP); | |
| 553 | |
| 554 if (primitiveIsSrc) { | 550 if (primitiveIsSrc) { |
| 555 shaderFP = GrXfermodeFragmentProcessor::CreateFromDstProcessor(s
haderFP, | 551 shaderFP = GrXfermodeFragmentProcessor::MakeFromDstProcessor(std
::move(shaderFP), |
| 556 *
primColorMode); | 552 *pr
imColorMode); |
| 557 } else { | 553 } else { |
| 558 shaderFP = GrXfermodeFragmentProcessor::CreateFromSrcProcessor(s
haderFP, | 554 shaderFP = GrXfermodeFragmentProcessor::MakeFromSrcProcessor(std
::move(shaderFP), |
| 559 *
primColorMode); | 555 *pr
imColorMode); |
| 560 } | 556 } |
| 561 aufp.reset(shaderFP); | |
| 562 // The above may return null if compose results in a pass through of
the prim color. | 557 // The above may return null if compose results in a pass through of
the prim color. |
| 563 if (shaderFP) { | 558 if (shaderFP) { |
| 564 grPaint->addColorFragmentProcessor(shaderFP); | 559 grPaint->addColorFragmentProcessor(shaderFP); |
| 565 } | 560 } |
| 566 | 561 |
| 567 GrColor paintAlpha = SkColorAlphaToGrColor(skPaint.getColor()); | 562 GrColor paintAlpha = SkColorAlphaToGrColor(skPaint.getColor()); |
| 568 if (GrColor_WHITE != paintAlpha) { | 563 if (GrColor_WHITE != paintAlpha) { |
| 569 grPaint->addColorFragmentProcessor(GrConstColorProcessor::Create
( | 564 grPaint->addColorFragmentProcessor(GrConstColorProcessor::Make( |
| 570 paintAlpha, GrConstColorProcessor::kModulateRGBA_InputMode))
->unref(); | 565 paintAlpha, GrConstColorProcessor::kModulateRGBA_InputMode))
; |
| 571 } | 566 } |
| 572 } else { | 567 } else { |
| 573 // The shader's FP sees the paint unpremul color | 568 // The shader's FP sees the paint unpremul color |
| 574 grPaint->setColor(SkColorToUnpremulGrColor(skPaint.getColor())); | 569 grPaint->setColor(SkColorToUnpremulGrColor(skPaint.getColor())); |
| 575 grPaint->addColorFragmentProcessor(shaderFP); | 570 grPaint->addColorFragmentProcessor(std::move(shaderFP)); |
| 576 } | 571 } |
| 577 } else { | 572 } else { |
| 578 if (primColorMode) { | 573 if (primColorMode) { |
| 579 // There is a blend between the primitive color and the paint color.
The blend considers | 574 // There is a blend between the primitive color and the paint color.
The blend considers |
| 580 // the opaque paint color. The paint's alpha is applied to the post-
blended color. | 575 // the opaque paint color. The paint's alpha is applied to the post-
blended color. |
| 581 SkAutoTUnref<const GrFragmentProcessor> processor( | 576 sk_sp<GrFragmentProcessor> processor( |
| 582 GrConstColorProcessor::Create(SkColorToOpaqueGrColor(skPaint.get
Color()), | 577 GrConstColorProcessor::Make(SkColorToOpaqueGrColor(skPaint.getCo
lor()), |
| 583 GrConstColorProcessor::kIgnore_Inp
utMode)); | 578 GrConstColorProcessor::kIgnore_Inp
utMode)); |
| 584 if (primitiveIsSrc) { | 579 if (primitiveIsSrc) { |
| 585 processor.reset(GrXfermodeFragmentProcessor::CreateFromDstProces
sor(processor, | 580 processor = GrXfermodeFragmentProcessor::MakeFromDstProcessor(st
d::move(processor), |
| 586
*primColorMode)); | 581 *p
rimColorMode); |
| 587 } else { | 582 } else { |
| 588 processor.reset(GrXfermodeFragmentProcessor::CreateFromSrcProces
sor(processor, | 583 processor = GrXfermodeFragmentProcessor::MakeFromSrcProcessor(st
d::move(processor), |
| 589
*primColorMode)); | 584 *p
rimColorMode); |
| 590 | |
| 591 } | 585 } |
| 592 if (processor) { | 586 if (processor) { |
| 593 grPaint->addColorFragmentProcessor(processor); | 587 grPaint->addColorFragmentProcessor(std::move(processor)); |
| 594 } | 588 } |
| 595 | 589 |
| 596 grPaint->setColor(SkColorToOpaqueGrColor(skPaint.getColor())); | 590 grPaint->setColor(SkColorToOpaqueGrColor(skPaint.getColor())); |
| 597 | 591 |
| 598 GrColor paintAlpha = SkColorAlphaToGrColor(skPaint.getColor()); | 592 GrColor paintAlpha = SkColorAlphaToGrColor(skPaint.getColor()); |
| 599 if (GrColor_WHITE != paintAlpha) { | 593 if (GrColor_WHITE != paintAlpha) { |
| 600 grPaint->addColorFragmentProcessor(GrConstColorProcessor::Create
( | 594 grPaint->addColorFragmentProcessor(GrConstColorProcessor::Make( |
| 601 paintAlpha, GrConstColorProcessor::kModulateRGBA_InputMode))
->unref(); | 595 paintAlpha, GrConstColorProcessor::kModulateRGBA_InputMode))
; |
| 602 } | 596 } |
| 603 } else { | 597 } else { |
| 604 // No shader, no primitive color. | 598 // No shader, no primitive color. |
| 605 grPaint->setColor(SkColorToPremulGrColor(skPaint.getColor())); | 599 grPaint->setColor(SkColorToPremulGrColor(skPaint.getColor())); |
| 606 applyColorFilterToPaintColor = true; | 600 applyColorFilterToPaintColor = true; |
| 607 } | 601 } |
| 608 } | 602 } |
| 609 | 603 |
| 610 SkColorFilter* colorFilter = skPaint.getColorFilter(); | 604 SkColorFilter* colorFilter = skPaint.getColorFilter(); |
| 611 if (colorFilter) { | 605 if (colorFilter) { |
| 612 if (applyColorFilterToPaintColor) { | 606 if (applyColorFilterToPaintColor) { |
| 613 grPaint->setColor(SkColorToPremulGrColor(colorFilter->filterColor(sk
Paint.getColor()))); | 607 grPaint->setColor(SkColorToPremulGrColor(colorFilter->filterColor(sk
Paint.getColor()))); |
| 614 } else { | 608 } else { |
| 615 SkAutoTUnref<const GrFragmentProcessor> cfFP( | 609 sk_sp<GrFragmentProcessor> cfFP(colorFilter->asFragmentProcessor(con
text)); |
| 616 colorFilter->asFragmentProcessor(context)); | |
| 617 if (cfFP) { | 610 if (cfFP) { |
| 618 grPaint->addColorFragmentProcessor(cfFP); | 611 grPaint->addColorFragmentProcessor(std::move(cfFP)); |
| 619 } else { | 612 } else { |
| 620 return false; | 613 return false; |
| 621 } | 614 } |
| 622 } | 615 } |
| 623 } | 616 } |
| 624 | 617 |
| 625 // When the xfermode is null on the SkPaint (meaning kSrcOver) we need the X
PFactory field on | 618 // When the xfermode is null on the SkPaint (meaning kSrcOver) we need the X
PFactory field on |
| 626 // the GrPaint to also be null (also kSrcOver). | 619 // the GrPaint to also be null (also kSrcOver). |
| 627 SkASSERT(!grPaint->getXPFactory()); | 620 SkASSERT(!grPaint->getXPFactory()); |
| 628 SkXfermode* xfermode = skPaint.getXfermode(); | 621 SkXfermode* xfermode = skPaint.getXfermode(); |
| 629 if (xfermode) { | 622 if (xfermode) { |
| 630 // SafeUnref in case a new xfermode is added that returns null. | 623 grPaint->setXPFactory(xfermode->asXPFactory()); |
| 631 // In such cases we will fall back to kSrcOver_Mode. | |
| 632 SkSafeUnref(grPaint->setXPFactory(xfermode->asXPFactory())); | |
| 633 } | 624 } |
| 634 | 625 |
| 635 #ifndef SK_IGNORE_GPU_DITHER | 626 #ifndef SK_IGNORE_GPU_DITHER |
| 636 if (skPaint.isDither() && grPaint->numColorFragmentProcessors() > 0) { | 627 if (skPaint.isDither() && grPaint->numColorFragmentProcessors() > 0) { |
| 637 grPaint->addColorFragmentProcessor(GrDitherEffect::Create())->unref(); | 628 grPaint->addColorFragmentProcessor(GrDitherEffect::Make()); |
| 638 } | 629 } |
| 639 #endif | 630 #endif |
| 640 return true; | 631 return true; |
| 641 } | 632 } |
| 642 | 633 |
| 643 bool SkPaintToGrPaint(GrContext* context, const SkPaint& skPaint, const SkMatrix
& viewM, | 634 bool SkPaintToGrPaint(GrContext* context, const SkPaint& skPaint, const SkMatrix
& viewM, |
| 644 bool allowSRGBInputs, GrPaint* grPaint) { | 635 bool allowSRGBInputs, GrPaint* grPaint) { |
| 645 return skpaint_to_grpaint_impl(context, skPaint, viewM, nullptr, nullptr, fa
lse, | 636 return skpaint_to_grpaint_impl(context, skPaint, viewM, nullptr, nullptr, fa
lse, |
| 646 allowSRGBInputs, grPaint); | 637 allowSRGBInputs, grPaint); |
| 647 } | 638 } |
| 648 | 639 |
| 649 /** Replaces the SkShader (if any) on skPaint with the passed in GrFragmentProce
ssor. */ | 640 /** Replaces the SkShader (if any) on skPaint with the passed in GrFragmentProce
ssor. */ |
| 650 bool SkPaintToGrPaintReplaceShader(GrContext* context, | 641 bool SkPaintToGrPaintReplaceShader(GrContext* context, |
| 651 const SkPaint& skPaint, | 642 const SkPaint& skPaint, |
| 652 const GrFragmentProcessor* shaderFP, | 643 sk_sp<GrFragmentProcessor> shaderFP, |
| 653 bool allowSRGBInputs, | 644 bool allowSRGBInputs, |
| 654 GrPaint* grPaint) { | 645 GrPaint* grPaint) { |
| 655 if (!shaderFP) { | 646 if (!shaderFP) { |
| 656 return false; | 647 return false; |
| 657 } | 648 } |
| 658 return skpaint_to_grpaint_impl(context, skPaint, SkMatrix::I(), &shaderFP, n
ullptr, false, | 649 return skpaint_to_grpaint_impl(context, skPaint, SkMatrix::I(), &shaderFP, n
ullptr, false, |
| 659 allowSRGBInputs, grPaint); | 650 allowSRGBInputs, grPaint); |
| 660 } | 651 } |
| 661 | 652 |
| 662 /** Ignores the SkShader (if any) on skPaint. */ | 653 /** Ignores the SkShader (if any) on skPaint. */ |
| 663 bool SkPaintToGrPaintNoShader(GrContext* context, | 654 bool SkPaintToGrPaintNoShader(GrContext* context, |
| 664 const SkPaint& skPaint, | 655 const SkPaint& skPaint, |
| 665 bool allowSRGBInputs, | 656 bool allowSRGBInputs, |
| 666 GrPaint* grPaint) { | 657 GrPaint* grPaint) { |
| 667 // Use a ptr to a nullptr to to indicate that the SkShader is ignored and no
t replaced. | 658 // Use a ptr to a nullptr to to indicate that the SkShader is ignored and no
t replaced. |
| 668 static const GrFragmentProcessor* kNullShaderFP = nullptr; | 659 static sk_sp<GrFragmentProcessor> kNullShaderFP(nullptr); |
| 669 static const GrFragmentProcessor** kIgnoreShader = &kNullShaderFP; | 660 static sk_sp<GrFragmentProcessor>* kIgnoreShader = &kNullShaderFP; |
| 670 return skpaint_to_grpaint_impl(context, skPaint, SkMatrix::I(), kIgnoreShade
r, nullptr, false, | 661 return skpaint_to_grpaint_impl(context, skPaint, SkMatrix::I(), kIgnoreShade
r, nullptr, false, |
| 671 allowSRGBInputs, grPaint); | 662 allowSRGBInputs, grPaint); |
| 672 } | 663 } |
| 673 | 664 |
| 674 /** Blends the SkPaint's shader (or color if no shader) with a per-primitive col
or which must | 665 /** Blends the SkPaint's shader (or color if no shader) with a per-primitive col
or which must |
| 675 be setup as a vertex attribute using the specified SkXfermode::Mode. */ | 666 be setup as a vertex attribute using the specified SkXfermode::Mode. */ |
| 676 bool SkPaintToGrPaintWithXfermode(GrContext* context, | 667 bool SkPaintToGrPaintWithXfermode(GrContext* context, |
| 677 const SkPaint& skPaint, | 668 const SkPaint& skPaint, |
| 678 const SkMatrix& viewM, | 669 const SkMatrix& viewM, |
| 679 SkXfermode::Mode primColorMode, | 670 SkXfermode::Mode primColorMode, |
| 680 bool primitiveIsSrc, | 671 bool primitiveIsSrc, |
| 681 bool allowSRGBInputs, | 672 bool allowSRGBInputs, |
| 682 GrPaint* grPaint) { | 673 GrPaint* grPaint) { |
| 683 return skpaint_to_grpaint_impl(context, skPaint, viewM, nullptr, &primColorM
ode, primitiveIsSrc, | 674 return skpaint_to_grpaint_impl(context, skPaint, viewM, nullptr, &primColorM
ode, primitiveIsSrc, |
| 684 allowSRGBInputs, grPaint); | 675 allowSRGBInputs, grPaint); |
| 685 } | 676 } |
| 686 | 677 |
| 687 bool SkPaintToGrPaintWithTexture(GrContext* context, | 678 bool SkPaintToGrPaintWithTexture(GrContext* context, |
| 688 const SkPaint& paint, | 679 const SkPaint& paint, |
| 689 const SkMatrix& viewM, | 680 const SkMatrix& viewM, |
| 690 const GrFragmentProcessor* fp, | 681 sk_sp<GrFragmentProcessor> fp, |
| 691 bool textureIsAlphaOnly, | 682 bool textureIsAlphaOnly, |
| 692 bool allowSRGBInputs, | 683 bool allowSRGBInputs, |
| 693 GrPaint* grPaint) { | 684 GrPaint* grPaint) { |
| 694 SkAutoTUnref<const GrFragmentProcessor> shaderFP; | 685 sk_sp<GrFragmentProcessor> shaderFP; |
| 695 if (textureIsAlphaOnly) { | 686 if (textureIsAlphaOnly) { |
| 696 if (const SkShader* shader = paint.getShader()) { | 687 if (const SkShader* shader = paint.getShader()) { |
| 697 SkSourceGammaTreatment gammaTreatment = allowSRGBInputs | 688 SkSourceGammaTreatment gammaTreatment = allowSRGBInputs |
| 698 ? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIg
nore; | 689 ? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIg
nore; |
| 699 shaderFP.reset(shader->asFragmentProcessor(context, | 690 shaderFP = shader->asFragmentProcessor(context, |
| 700 viewM, | 691 viewM, |
| 701 nullptr, | 692 nullptr, |
| 702 paint.getFilterQuality(), | 693 paint.getFilterQuality(), |
| 703 gammaTreatment)); | 694 gammaTreatment); |
| 704 if (!shaderFP) { | 695 if (!shaderFP) { |
| 705 return false; | 696 return false; |
| 706 } | 697 } |
| 707 const GrFragmentProcessor* fpSeries[] = { shaderFP.get(), fp }; | 698 sk_sp<GrFragmentProcessor> fpSeries[] = { std::move(shaderFP), std::
move(fp) }; |
| 708 shaderFP.reset(GrFragmentProcessor::RunInSeries(fpSeries, 2)); | 699 shaderFP = GrFragmentProcessor::RunInSeries(fpSeries, 2); |
| 709 } else { | 700 } else { |
| 710 shaderFP.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp
)); | 701 shaderFP = GrFragmentProcessor::MulOutputByInputUnpremulColor(fp); |
| 711 } | 702 } |
| 712 } else { | 703 } else { |
| 713 shaderFP.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); | 704 shaderFP = GrFragmentProcessor::MulOutputByInputAlpha(fp); |
| 714 } | 705 } |
| 715 | 706 |
| 716 return SkPaintToGrPaintReplaceShader(context, paint, shaderFP.get(), allowSR
GBInputs, grPaint); | 707 return SkPaintToGrPaintReplaceShader(context, paint, std::move(shaderFP), al
lowSRGBInputs, |
| 708 grPaint); |
| 717 } | 709 } |
| 718 | 710 |
| 719 | 711 |
| 720 ////////////////////////////////////////////////////////////////////////////////
//////////////// | 712 ////////////////////////////////////////////////////////////////////////////////
//////////////// |
| 721 | 713 |
| 722 SkImageInfo GrMakeInfoFromTexture(GrTexture* tex, int w, int h, bool isOpaque) { | 714 SkImageInfo GrMakeInfoFromTexture(GrTexture* tex, int w, int h, bool isOpaque) { |
| 723 #ifdef SK_DEBUG | 715 #ifdef SK_DEBUG |
| 724 const GrSurfaceDesc& desc = tex->desc(); | 716 const GrSurfaceDesc& desc = tex->desc(); |
| 725 SkASSERT(w <= desc.fWidth); | 717 SkASSERT(w <= desc.fWidth); |
| 726 SkASSERT(h <= desc.fHeight); | 718 SkASSERT(h <= desc.fHeight); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 775 SkErrorInternals::SetError( kInvalidPaint_SkError, | 767 SkErrorInternals::SetError( kInvalidPaint_SkError, |
| 776 "Sorry, I don't understand the filtering
" | 768 "Sorry, I don't understand the filtering
" |
| 777 "mode you asked for. Falling back to " | 769 "mode you asked for. Falling back to " |
| 778 "MIPMaps."); | 770 "MIPMaps."); |
| 779 textureFilterMode = GrTextureParams::kMipMap_FilterMode; | 771 textureFilterMode = GrTextureParams::kMipMap_FilterMode; |
| 780 break; | 772 break; |
| 781 | 773 |
| 782 } | 774 } |
| 783 return textureFilterMode; | 775 return textureFilterMode; |
| 784 } | 776 } |
| OLD | NEW |