diff options
author | bsalomon <bsalomon@google.com> | 2015-04-27 10:07:04 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-27 10:07:04 -0700 |
commit | d79c549467e5e7be025e38357f179b7965ed2ec3 (patch) | |
tree | 0720748cd608879aaca87f563fdb795085719bc3 /src/gpu/gl/builders | |
parent | f0c000df552a3ab51da6cd4997f5878825dec97e (diff) |
Make non-AA hairline stroke rects snap to pixels centers so they close.
BUG=skia:3717
Review URL: https://codereview.chromium.org/1101663007
Diffstat (limited to 'src/gpu/gl/builders')
-rw-r--r-- | src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp index 00e96a5618..20e9f0861a 100644 --- a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp +++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp @@ -42,11 +42,18 @@ void GrGLVertexBuilder::transformToNormalizedDeviceSpace(const GrShaderVar& posV kVec4f_GrSLType, kDefault_GrSLPrecision, fProgramBuilder->rtAdjustment(), &fRtAdjustName); - - // 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. - if (kVec3f_GrSLType == posVar.getType()) { + if (this->getProgramBuilder()->desc().header().fSnapVerticesToPixelCenters) { + if (kVec3f_GrSLType == posVar.getType()) { + const char* p = posVar.c_str(); + this->codeAppendf("{vec2 _posTmp = vec2(%s.x/%s.z, %s.y/%s.z);", p, p, p, p); + } else { + SkASSERT(kVec2f_GrSLType == posVar.getType()); + this->codeAppendf("{vec2 _posTmp = %s;", posVar.c_str()); + } + this->codeAppendf("_posTmp = floor(_posTmp) + vec2(0.5, 0.5);" + "gl_Position = vec4(_posTmp.x * %s.x + %s.y, _posTmp.y * %s.z + %s.w, 0, 1);}", + fRtAdjustName, fRtAdjustName, fRtAdjustName, fRtAdjustName); + } else 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()); @@ -56,9 +63,8 @@ void GrGLVertexBuilder::transformToNormalizedDeviceSpace(const GrShaderVar& posV posVar.c_str(), fRtAdjustName, fRtAdjustName, posVar.c_str(), fRtAdjustName, fRtAdjustName); } - - // We could have the GrGeometryProcessor do this, but its just easier to have it performed here. - // If we ever need to set variable pointsize, then we can reinvestigate + // We could have the GrGeometryProcessor do this, but its just easier to have it performed + // here. If we ever need to set variable pointsize, then we can reinvestigate this->codeAppend("gl_PointSize = 1.0;"); } |