diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkClipStack.cpp | 13 | ||||
-rw-r--r-- | src/gpu/effects/GrConvexPolyEffect.cpp | 23 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp | 10 |
3 files changed, 22 insertions, 24 deletions
diff --git a/src/core/SkClipStack.cpp b/src/core/SkClipStack.cpp index 515596a969..863dc9a387 100644 --- a/src/core/SkClipStack.cpp +++ b/src/core/SkClipStack.cpp @@ -418,19 +418,6 @@ void SkClipStack::Element::updateBoundAndGenID(const Element* prior) { break; } - if (!fDoAA) { - // Here we mimic a non-anti-aliased scanline system. If there is - // no anti-aliasing we can integerize the bounding box to exclude - // fractional parts that won't be rendered. - // Note: the left edge is handled slightly differently below. We - // are a bit more generous in the rounding since we don't want to - // risk missing the left pixels when fLeft is very close to .5 - fFiniteBound.set(SkScalarFloorToScalar(fFiniteBound.fLeft+0.45f), - SkScalarRoundToScalar(fFiniteBound.fTop), - SkScalarRoundToScalar(fFiniteBound.fRight), - SkScalarRoundToScalar(fFiniteBound.fBottom)); - } - // Now determine the previous Element's bound information taking into // account that there may be no previous clip SkRect prevFinite; diff --git a/src/gpu/effects/GrConvexPolyEffect.cpp b/src/gpu/effects/GrConvexPolyEffect.cpp index 7035094fa6..615c341ef2 100644 --- a/src/gpu/effects/GrConvexPolyEffect.cpp +++ b/src/gpu/effects/GrConvexPolyEffect.cpp @@ -137,10 +137,14 @@ void GLAARectEffect::emitCode(GrGLFPBuilder* builder, fsBuilder->codeAppendf("\t\tfloat alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0));\n"); } else { fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n"); - fsBuilder->codeAppendf("\t\talpha *= (%s.x - %s.x) > -0.5 ? 1.0 : 0.0;\n", fragmentPos, rectName); - fsBuilder->codeAppendf("\t\talpha *= (%s.z - %s.x) > -0.5 ? 1.0 : 0.0;\n", rectName, fragmentPos); - fsBuilder->codeAppendf("\t\talpha *= (%s.y - %s.y) > -0.5 ? 1.0 : 0.0;\n", fragmentPos, rectName); - fsBuilder->codeAppendf("\t\talpha *= (%s.w - %s.y) > -0.5 ? 1.0 : 0.0;\n", rectName, fragmentPos); + fsBuilder->codeAppendf("\t\talpha *= (%s.x - %s.x) > -0.5 ? 1.0 : 0.0;\n", + fragmentPos, rectName); + fsBuilder->codeAppendf("\t\talpha *= (%s.z - %s.x) > -0.5 ? 1.0 : 0.0;\n", + rectName, fragmentPos); + fsBuilder->codeAppendf("\t\talpha *= (%s.y - %s.y) > -0.5 ? 1.0 : 0.0;\n", + fragmentPos, rectName); + fsBuilder->codeAppendf("\t\talpha *= (%s.w - %s.y) > -0.5 ? 1.0 : 0.0;\n", + rectName, fragmentPos); } if (GrProcessorEdgeTypeIsInverseFill(aare.getEdgeType())) { @@ -154,8 +158,10 @@ void GLAARectEffect::setData(const GrGLProgramDataManager& pdman, const GrProces const AARectEffect& aare = processor.cast<AARectEffect>(); const SkRect& rect = aare.getRect(); if (rect != fPrevRect) { - pdman.set4f(fRectUniform, rect.fLeft + 0.5f, rect.fTop + 0.5f, - rect.fRight - 0.5f, rect.fBottom - 0.5f); + // Add a device space "nudge" of 0.05f, 0.05f to match raster's rounding behavior for + // BW clipping/drawing + pdman.set4f(fRectUniform, rect.fLeft + 0.55f, rect.fTop + 0.55f, + rect.fRight - 0.45f, rect.fBottom - 0.45f); fPrevRect = rect; } } @@ -221,7 +227,10 @@ void GrGLConvexPolyEffect::emitCode(GrGLFPBuilder* builder, fsBuilder->codeAppend("\t\tfloat edge;\n"); const char* fragmentPos = fsBuilder->fragmentPosition(); for (int i = 0; i < cpe.getEdgeCount(); ++i) { - fsBuilder->codeAppendf("\t\tedge = dot(%s[%d], vec3(%s.x, %s.y, 1));\n", + // Add a device space "nudge" of 0.05f, 0.05f to match raster's rounding behavior for + // BW clipping/drawing. Since we are "nudging" fragment positions we have to go in + // the opposite direction. + fsBuilder->codeAppendf("\t\tedge = dot(%s[%d], vec3(%s.x - 0.05, %s.y - 0.05, 1));\n", edgeArrayName, i, fragmentPos, fragmentPos); if (GrProcessorEdgeTypeIsAA(cpe.getEdgeType())) { fsBuilder->codeAppend("\t\tedge = clamp(edge, 0.0, 1.0);\n"); diff --git a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp index f17e741169..f0b645ee42 100644 --- a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp +++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp @@ -47,13 +47,15 @@ void GrGLVertexBuilder::transformToNormalizedDeviceSpace(const GrShaderVar& posV // Transform from Skia's device coords to GL's normalized device coords. Note that // because we want to "nudge" the device space positions we are converting to // non-homogeneous NDC. + // The "0.05" nudge serves to match the raster path's rounding for bw draws. + // For aa draws we just assume the impact will be minimal - so we always perform the nudge. if (kVec3f_GrSLType == posVar.getType()) { - this->codeAppendf("gl_Position = vec4(dot(%s.xz, %s.xy)/%s.z, dot(%s.yz, %s.zw)/%s.z, 0, 1);", - posVar.c_str(), fRtAdjustName, posVar.c_str(), - posVar.c_str(), fRtAdjustName, posVar.c_str()); + this->codeAppendf("gl_Position = vec4((dot(%s.xz, %s.xy)/%s.z) + 0.05 * %s.x, (dot(%s.yz, %s.zw)/%s.z) + 0.05 * %s.z, 0, 1);", + posVar.c_str(), fRtAdjustName, posVar.c_str(), fRtAdjustName, + posVar.c_str(), fRtAdjustName, posVar.c_str(), fRtAdjustName); } else { SkASSERT(kVec2f_GrSLType == posVar.getType()); - this->codeAppendf("gl_Position = vec4(%s.x * %s.x + %s.y, %s.y * %s.z + %s.w, 0, 1);", + this->codeAppendf("gl_Position = vec4((%s.x + 0.05) * %s.x + %s.y, (%s.y + 0.05) * %s.z + %s.w, 0, 1);", posVar.c_str(), fRtAdjustName, fRtAdjustName, posVar.c_str(), fRtAdjustName, fRtAdjustName); } |