| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 "GrDashingEffect.h" | 8 #include "GrDashingEffect.h" |
| 9 | 9 |
| 10 #include "../GrAARectRenderer.h" | 10 #include "../GrAARectRenderer.h" |
| (...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 args.fPB->addVarying("Coord", &v); | 578 args.fPB->addVarying("Coord", &v); |
| 579 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dce.inCoord()->fName); | 579 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dce.inCoord()->fName); |
| 580 | 580 |
| 581 // Setup pass through color | 581 // Setup pass through color |
| 582 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NU
LL, &fColorUniform); | 582 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NU
LL, &fColorUniform); |
| 583 | 583 |
| 584 // setup coord outputs | 584 // setup coord outputs |
| 585 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), dce.inPositi
on()->fName); | 585 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), dce.inPositi
on()->fName); |
| 586 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), dce.inPosition(
)->fName); | 586 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), dce.inPosition(
)->fName); |
| 587 | 587 |
| 588 // setup uniform viewMatrix |
| 589 this->setupUniformViewMatrix(pb); |
| 590 |
| 588 // setup position varying | 591 // setup position varying |
| 589 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(), vs
Builder->uViewM(), | 592 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(), th
is->uViewM(), |
| 590 dce.inPosition()->fName); | 593 dce.inPosition()->fName); |
| 591 | 594 |
| 592 // transforms all points so that we can compare them to our test circle | 595 // transforms all points so that we can compare them to our test circle |
| 593 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 596 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| 594 fsBuilder->codeAppendf("\t\tfloat xShifted = %s.x - floor(%s.x / %s.z) * %s.
z;\n", | 597 fsBuilder->codeAppendf("\t\tfloat xShifted = %s.x - floor(%s.x / %s.z) * %s.
z;\n", |
| 595 v.fsIn(), v.fsIn(), paramName, paramName); | 598 v.fsIn(), v.fsIn(), paramName, paramName); |
| 596 fsBuilder->codeAppendf("\t\tvec2 fragPosShifted = vec2(xShifted, %s.y);\n",
v.fsIn()); | 599 fsBuilder->codeAppendf("\t\tvec2 fragPosShifted = vec2(xShifted, %s.y);\n",
v.fsIn()); |
| 597 fsBuilder->codeAppendf("\t\tvec2 center = vec2(%s.y, 0.0);\n", paramName); | 600 fsBuilder->codeAppendf("\t\tvec2 center = vec2(%s.y, 0.0);\n", paramName); |
| 598 fsBuilder->codeAppend("\t\tfloat dist = length(center - fragPosShifted);\n")
; | 601 fsBuilder->codeAppend("\t\tfloat dist = length(center - fragPosShifted);\n")
; |
| 599 if (GrProcessorEdgeTypeIsAA(dce.getEdgeType())) { | 602 if (GrProcessorEdgeTypeIsAA(dce.getEdgeType())) { |
| 600 fsBuilder->codeAppendf("\t\tfloat diff = dist - %s.x;\n", paramName); | 603 fsBuilder->codeAppendf("\t\tfloat diff = dist - %s.x;\n", paramName); |
| 601 fsBuilder->codeAppend("\t\tdiff = 1.0 - diff;\n"); | 604 fsBuilder->codeAppend("\t\tdiff = 1.0 - diff;\n"); |
| 602 fsBuilder->codeAppend("\t\tfloat alpha = clamp(diff, 0.0, 1.0);\n"); | 605 fsBuilder->codeAppend("\t\tfloat alpha = clamp(diff, 0.0, 1.0);\n"); |
| 603 } else { | 606 } else { |
| 604 fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); | 607 fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); |
| 605 fsBuilder->codeAppendf("\t\talpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;\n",
paramName); | 608 fsBuilder->codeAppendf("\t\talpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;\n",
paramName); |
| 606 } | 609 } |
| 607 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | 610 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
| 608 } | 611 } |
| 609 | 612 |
| 610 void GLDashingCircleEffect::setData(const GrGLProgramDataManager& pdman, | 613 void GLDashingCircleEffect::setData(const GrGLProgramDataManager& pdman, |
| 611 const GrPrimitiveProcessor& processor, | 614 const GrPrimitiveProcessor& processor, |
| 612 const GrBatchTracker& bt) { | 615 const GrBatchTracker& bt) { |
| 616 this->setUniformViewMatrix(pdman, processor.viewMatrix()); |
| 617 |
| 613 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); | 618 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); |
| 614 SkScalar radius = dce.getRadius(); | 619 SkScalar radius = dce.getRadius(); |
| 615 SkScalar centerX = dce.getCenterX(); | 620 SkScalar centerX = dce.getCenterX(); |
| 616 SkScalar intervalLength = dce.getIntervalLength(); | 621 SkScalar intervalLength = dce.getIntervalLength(); |
| 617 if (radius != fPrevRadius || centerX != fPrevCenterX || intervalLength != fP
revIntervalLength) { | 622 if (radius != fPrevRadius || centerX != fPrevCenterX || intervalLength != fP
revIntervalLength) { |
| 618 pdman.set3f(fParamUniform, radius - 0.5f, centerX, intervalLength); | 623 pdman.set3f(fParamUniform, radius - 0.5f, centerX, intervalLength); |
| 619 fPrevRadius = radius; | 624 fPrevRadius = radius; |
| 620 fPrevCenterX = centerX; | 625 fPrevCenterX = centerX; |
| 621 fPrevIntervalLength = intervalLength; | 626 fPrevIntervalLength = intervalLength; |
| 622 } | 627 } |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 871 args.fPB->addVarying("Coord", &v); | 876 args.fPB->addVarying("Coord", &v); |
| 872 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), de.inCoord()->fName); | 877 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), de.inCoord()->fName); |
| 873 | 878 |
| 874 // Setup pass through color | 879 // Setup pass through color |
| 875 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NU
LL, &fColorUniform); | 880 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NU
LL, &fColorUniform); |
| 876 | 881 |
| 877 // setup coord outputs | 882 // setup coord outputs |
| 878 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), de.inPositio
n()->fName); | 883 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), de.inPositio
n()->fName); |
| 879 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), de.inPosition()
->fName); | 884 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), de.inPosition()
->fName); |
| 880 | 885 |
| 886 // setup uniform viewMatrix |
| 887 this->setupUniformViewMatrix(pb); |
| 888 |
| 881 // setup position varying | 889 // setup position varying |
| 882 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(), vs
Builder->uViewM(), | 890 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition(), th
is->uViewM(), |
| 883 de.inPosition()->fName); | 891 de.inPosition()->fName); |
| 884 | 892 |
| 885 // transforms all points so that we can compare them to our test rect | 893 // transforms all points so that we can compare them to our test rect |
| 886 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 894 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| 887 fsBuilder->codeAppendf("\t\tfloat xShifted = %s.x - floor(%s.x / %s) * %s;\n
", | 895 fsBuilder->codeAppendf("\t\tfloat xShifted = %s.x - floor(%s.x / %s) * %s;\n
", |
| 888 v.fsIn(), v.fsIn(), intervalName, intervalName); | 896 v.fsIn(), v.fsIn(), intervalName, intervalName); |
| 889 fsBuilder->codeAppendf("\t\tvec2 fragPosShifted = vec2(xShifted, %s.y);\n",
v.fsIn()); | 897 fsBuilder->codeAppendf("\t\tvec2 fragPosShifted = vec2(xShifted, %s.y);\n",
v.fsIn()); |
| 890 if (GrProcessorEdgeTypeIsAA(de.getEdgeType())) { | 898 if (GrProcessorEdgeTypeIsAA(de.getEdgeType())) { |
| 891 // The amount of coverage removed in x and y by the edges is computed as
a pair of negative | 899 // The amount of coverage removed in x and y by the edges is computed as
a pair of negative |
| 892 // numbers, xSub and ySub. | 900 // numbers, xSub and ySub. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 903 fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); | 911 fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); |
| 904 fsBuilder->codeAppendf("\t\talpha *= (fragPosShifted.x - %s.x) > -0.5 ?
1.0 : 0.0;\n", rectName); | 912 fsBuilder->codeAppendf("\t\talpha *= (fragPosShifted.x - %s.x) > -0.5 ?
1.0 : 0.0;\n", rectName); |
| 905 fsBuilder->codeAppendf("\t\talpha *= (%s.z - fragPosShifted.x) >= -0.5 ?
1.0 : 0.0;\n", rectName); | 913 fsBuilder->codeAppendf("\t\talpha *= (%s.z - fragPosShifted.x) >= -0.5 ?
1.0 : 0.0;\n", rectName); |
| 906 } | 914 } |
| 907 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | 915 fsBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
| 908 } | 916 } |
| 909 | 917 |
| 910 void GLDashingLineEffect::setData(const GrGLProgramDataManager& pdman, | 918 void GLDashingLineEffect::setData(const GrGLProgramDataManager& pdman, |
| 911 const GrPrimitiveProcessor& processor, | 919 const GrPrimitiveProcessor& processor, |
| 912 const GrBatchTracker& bt) { | 920 const GrBatchTracker& bt) { |
| 921 this->setUniformViewMatrix(pdman, processor.viewMatrix()); |
| 922 |
| 913 const DashingLineEffect& de = processor.cast<DashingLineEffect>(); | 923 const DashingLineEffect& de = processor.cast<DashingLineEffect>(); |
| 914 const SkRect& rect = de.getRect(); | 924 const SkRect& rect = de.getRect(); |
| 915 SkScalar intervalLength = de.getIntervalLength(); | 925 SkScalar intervalLength = de.getIntervalLength(); |
| 916 if (rect != fPrevRect || intervalLength != fPrevIntervalLength) { | 926 if (rect != fPrevRect || intervalLength != fPrevIntervalLength) { |
| 917 pdman.set4f(fRectUniform, rect.fLeft + 0.5f, rect.fTop + 0.5f, | 927 pdman.set4f(fRectUniform, rect.fLeft + 0.5f, rect.fTop + 0.5f, |
| 918 rect.fRight - 0.5f, rect.fBottom - 0.5f); | 928 rect.fRight - 0.5f, rect.fBottom - 0.5f); |
| 919 pdman.set1f(fIntervalUniform, intervalLength); | 929 pdman.set1f(fIntervalUniform, intervalLength); |
| 920 fPrevRect = rect; | 930 fPrevRect = rect; |
| 921 fPrevIntervalLength = intervalLength; | 931 fPrevIntervalLength = intervalLength; |
| 922 } | 932 } |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1052 SkScalarHalf(strokeWidth), | 1062 SkScalarHalf(strokeWidth), |
| 1053 localMatrix); | 1063 localMatrix); |
| 1054 case GrDashingEffect::kNonRound_DashCap: | 1064 case GrDashingEffect::kNonRound_DashCap: |
| 1055 return DashingLineEffect::Create(color, viewMatrix, edgeType, info,
strokeWidth, | 1065 return DashingLineEffect::Create(color, viewMatrix, edgeType, info,
strokeWidth, |
| 1056 localMatrix); | 1066 localMatrix); |
| 1057 default: | 1067 default: |
| 1058 SkFAIL("Unexpected dashed cap."); | 1068 SkFAIL("Unexpected dashed cap."); |
| 1059 } | 1069 } |
| 1060 return NULL; | 1070 return NULL; |
| 1061 } | 1071 } |
| OLD | NEW |