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, 24 insertions, 22 deletions
diff --git a/src/core/SkClipStack.cpp b/src/core/SkClipStack.cpp index 863dc9a387..515596a969 100644 --- a/src/core/SkClipStack.cpp +++ b/src/core/SkClipStack.cpp @@ -418,6 +418,19 @@ 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 9d9792e2b9..7035094fa6 100644 --- a/src/gpu/effects/GrConvexPolyEffect.cpp +++ b/src/gpu/effects/GrConvexPolyEffect.cpp @@ -137,14 +137,10 @@ 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())) { @@ -158,10 +154,8 @@ void GLAARectEffect::setData(const GrGLProgramDataManager& pdman, const GrProces const AARectEffect& aare = processor.cast<AARectEffect>(); const SkRect& rect = aare.getRect(); if (rect != fPrevRect) { - // 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); + pdman.set4f(fRectUniform, rect.fLeft + 0.5f, rect.fTop + 0.5f, + rect.fRight - 0.5f, rect.fBottom - 0.5f); fPrevRect = rect; } } @@ -227,10 +221,7 @@ void GrGLConvexPolyEffect::emitCode(GrGLFPBuilder* builder, fsBuilder->codeAppend("\t\tfloat edge;\n"); const char* fragmentPos = fsBuilder->fragmentPosition(); for (int i = 0; i < cpe.getEdgeCount(); ++i) { - // 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.05f, %s.y - 0.05f, 1));\n", + fsBuilder->codeAppendf("\t\tedge = dot(%s[%d], vec3(%s.x, %s.y, 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 f0b645ee42..f17e741169 100644 --- a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp +++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp @@ -47,15 +47,13 @@ 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) + 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); + 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()); } else { SkASSERT(kVec2f_GrSLType == posVar.getType()); - this->codeAppendf("gl_Position = vec4((%s.x + 0.05) * %s.x + %s.y, (%s.y + 0.05) * %s.z + %s.w, 0, 1);", + this->codeAppendf("gl_Position = vec4(%s.x * %s.x + %s.y, %s.y * %s.z + %s.w, 0, 1);", posVar.c_str(), fRtAdjustName, fRtAdjustName, posVar.c_str(), fRtAdjustName, fRtAdjustName); } |