diff options
author | 2014-08-11 16:00:44 -0700 | |
---|---|---|
committer | 2014-08-12 12:44:59 -0700 | |
commit | bf75945e7a1ae7c1000682716643c942c1e19ba6 (patch) | |
tree | 5be8c8acfb85bb0a6077691e2c0255232cace2ae /libs/hwui/OpenGLRenderer.cpp | |
parent | c28aceb11e736382bc7ee749483ea5f23299ad78 (diff) |
Rework shadow interpolation
bug:16852257
Use pow(alpha, 1.5) to avoid harsh edges on shadow alpha ramps.
Also adjusts shadow constants to compensate.
Change-Id: I5869956d7d292db2a8e496bc320084b6d64c3fb7
Diffstat (limited to 'libs/hwui/OpenGLRenderer.cpp')
-rwxr-xr-x | libs/hwui/OpenGLRenderer.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 636f218929cc..7123bfe76216 100755 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -1641,8 +1641,9 @@ void OpenGLRenderer::setupDrawNoTexture() { mCaches.disableTexCoordsVertexArray(); } -void OpenGLRenderer::setupDrawAA() { +void OpenGLRenderer::setupDrawAA(bool useShadowInterp) { mDescription.isAA = true; + mDescription.isShadowAA = useShadowInterp; } void OpenGLRenderer::setupDrawColor(int color, int alpha) { @@ -2365,7 +2366,7 @@ status_t OpenGLRenderer::drawPatches(const SkBitmap* bitmap, AssetAtlas::Entry* } status_t OpenGLRenderer::drawVertexBuffer(float translateX, float translateY, - const VertexBuffer& vertexBuffer, const SkPaint* paint, bool useOffset) { + const VertexBuffer& vertexBuffer, const SkPaint* paint, int displayFlags) { // not missing call to quickReject/dirtyLayer, always done at a higher level if (!vertexBuffer.getVertexCount()) { // no vertices to draw @@ -2381,13 +2382,14 @@ status_t OpenGLRenderer::drawVertexBuffer(float translateX, float translateY, setupDraw(); setupDrawNoTexture(); - if (isAA) setupDrawAA(); + if (isAA) setupDrawAA((displayFlags & kVertexBuffer_ShadowAA)); setupDrawColor(color, ((color >> 24) & 0xFF) * mSnapshot->alpha); setupDrawColorFilter(getColorFilter(paint)); setupDrawShader(getShader(paint)); setupDrawBlending(paint, isAA); setupDrawProgram(); - setupDrawModelView(kModelViewMode_Translate, useOffset, translateX, translateY, 0, 0); + setupDrawModelView(kModelViewMode_Translate, (displayFlags & kVertexBuffer_Offset), + translateX, translateY, 0, 0); setupDrawColorUniforms(getShader(paint)); setupDrawColorFilterUniforms(getColorFilter(paint)); setupDrawShaderUniforms(getShader(paint)); @@ -2397,7 +2399,6 @@ status_t OpenGLRenderer::drawVertexBuffer(float translateX, float translateY, mCaches.bindPositionVertexPointer(true, vertices, isAA ? gAlphaVertexStride : gVertexStride); mCaches.resetTexCoordsVertexPointer(); - int alphaSlot = -1; if (isAA) { void* alphaCoords = ((GLbyte*) vertices) + gVertexAlphaOffset; @@ -2466,8 +2467,8 @@ status_t OpenGLRenderer::drawLines(const float* points, int count, const SkPaint return DrawGlInfo::kStatusDone; } - bool useOffset = !paint->isAntiAlias(); - return drawVertexBuffer(buffer, paint, useOffset); + int displayFlags = paint->isAntiAlias() ? 0 : kVertexBuffer_Offset; + return drawVertexBuffer(buffer, paint, displayFlags); } status_t OpenGLRenderer::drawPoints(const float* points, int count, const SkPaint* paint) { @@ -2483,8 +2484,8 @@ status_t OpenGLRenderer::drawPoints(const float* points, int count, const SkPain return DrawGlInfo::kStatusDone; } - bool useOffset = !paint->isAntiAlias(); - return drawVertexBuffer(buffer, paint, useOffset); + int displayFlags = paint->isAntiAlias() ? 0 : kVertexBuffer_Offset; + return drawVertexBuffer(buffer, paint, displayFlags); } status_t OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) { @@ -3167,12 +3168,12 @@ status_t OpenGLRenderer::drawShadow(float casterAlpha, if (ambientShadowVertexBuffer && mAmbientShadowAlpha > 0) { paint.setARGB(casterAlpha * mAmbientShadowAlpha, 0, 0, 0); - drawVertexBuffer(*ambientShadowVertexBuffer, &paint); + drawVertexBuffer(*ambientShadowVertexBuffer, &paint, kVertexBuffer_ShadowAA); } if (spotShadowVertexBuffer && mSpotShadowAlpha > 0) { paint.setARGB(casterAlpha * mSpotShadowAlpha, 0, 0, 0); - drawVertexBuffer(*spotShadowVertexBuffer, &paint); + drawVertexBuffer(*spotShadowVertexBuffer, &paint, kVertexBuffer_ShadowAA); } return DrawGlInfo::kStatusDrew; |