Loading libs/hwui/OpenGLRenderer.cpp +13 −18 Original line number Diff line number Diff line Loading @@ -243,7 +243,7 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { const Rect& rect = layer->layer; drawTextureRect(rect.left, rect.top, rect.right, rect.bottom, layer->texture, layer->alpha, layer->mode, layer->blend, true); layer->texture, layer->alpha, layer->mode, layer->blend); LayerSize size(rect.getWidth(), rect.getHeight()); // Failing to add the layer to the cache should happen only if the Loading Loading @@ -486,8 +486,8 @@ void OpenGLRenderer::drawPatch(SkBitmap* bitmap, Res_png_9patch* patch, // Specify right and bottom as +1.0f from left/top to prevent scaling since the // patch mesh already defines the final size drawTextureMesh(left, top, left + 1.0f, top + 1.0f, texture->id, alpha / 255.0f, mode, texture->blend, true, &mesh->vertices[0].position[0], drawTextureMesh(left, top, left + 1.0f, top + 1.0f, texture->id, alpha / 255.0f, mode, texture->blend, &mesh->vertices[0].position[0], &mesh->vertices[0].texture[0], mesh->indices, mesh->indicesCount); } Loading Loading @@ -532,7 +532,7 @@ void OpenGLRenderer::drawColorRect(float left, float top, float right, float bot const GLfloat b = ((color ) & 0xFF) / 255.0f; // Pre-multiplication happens when setting the shader color chooseBlending(alpha < 255, mode, true); chooseBlending(alpha < 255, mode); mModelView.loadTranslate(left, top, 0.0f); mModelView.scale(right - left, bottom - top, 1.0f); Loading @@ -552,24 +552,23 @@ void OpenGLRenderer::drawColorRect(float left, float top, float right, float bot } void OpenGLRenderer::drawTextureRect(float left, float top, float right, float bottom, const Texture* texture, const SkPaint* paint, bool isPremultiplied) { const Texture* texture, const SkPaint* paint) { int alpha; SkXfermode::Mode mode; getAlphaAndMode(paint, &alpha, &mode); drawTextureMesh(left, top, right, bottom, texture->id, alpha / 255.0f, mode, texture->blend, isPremultiplied, &mDrawTextureVertices[0].position[0], &mDrawTextureVertices[0].texture[0], NULL); drawTextureMesh(left, top, right, bottom, texture->id, alpha / 255.0f, mode, texture->blend, &mDrawTextureVertices[0].position[0], &mDrawTextureVertices[0].texture[0], NULL); } void OpenGLRenderer::drawTextureRect(float left, float top, float right, float bottom, GLuint texture, float alpha, SkXfermode::Mode mode, bool blend, bool isPremultiplied) { drawTextureMesh(left, top, right, bottom, texture, alpha, mode, blend, isPremultiplied, GLuint texture, float alpha, SkXfermode::Mode mode, bool blend) { drawTextureMesh(left, top, right, bottom, texture, alpha, mode, blend, &mDrawTextureVertices[0].position[0], &mDrawTextureVertices[0].texture[0], NULL); } void OpenGLRenderer::drawTextureMesh(float left, float top, float right, float bottom, GLuint texture, float alpha, SkXfermode::Mode mode, bool blend, bool isPremultiplied, GLuint texture, float alpha, SkXfermode::Mode mode, bool blend, GLvoid* vertices, GLvoid* texCoords, GLvoid* indices, GLsizei elementsCount) { mModelView.loadTranslate(left, top, 0.0f); mModelView.scale(right - left, bottom - top, 1.0f); Loading @@ -577,17 +576,14 @@ void OpenGLRenderer::drawTextureMesh(float left, float top, float right, float b useShader(mDrawTextureShader); mDrawTextureShader->set(mOrthoMatrix, mModelView, mSnapshot->transform); chooseBlending(blend || alpha < 1.0f, mode, isPremultiplied); chooseBlending(blend || alpha < 1.0f, mode); glBindTexture(GL_TEXTURE_2D, texture); // TODO handle tiling and filtering here if (isPremultiplied) { // Always premultiplied glUniform4f(mDrawTextureShader->color, alpha, alpha, alpha, alpha); } else { glUniform4f(mDrawTextureShader->color, 1.0f, 1.0f, 1.0f, alpha); } glVertexAttribPointer(mDrawTextureShader->position, 2, GL_FLOAT, GL_FALSE, gDrawTextureVertexStride, vertices); Loading @@ -597,7 +593,6 @@ void OpenGLRenderer::drawTextureMesh(float left, float top, float right, float b if (!indices) { glDrawArrays(GL_TRIANGLE_STRIP, 0, gDrawTextureVertexCount); } else { // TODO: Use triangle strip instead glDrawElements(GL_TRIANGLES, elementsCount, GL_UNSIGNED_SHORT, indices); } Loading libs/hwui/OpenGLRenderer.h +5 −8 Original line number Diff line number Diff line Loading @@ -176,10 +176,9 @@ private: * @param alpha An additional translucency parameter, between 0.0f and 1.0f * @param mode The blending mode * @param blend True if the texture contains an alpha channel * @param isPremultiplied Indicates whether the texture has premultiplied alpha */ void drawTextureRect(float left, float top, float right, float bottom, GLuint texture, float alpha, SkXfermode::Mode mode, bool blend, bool isPremultiplied = true); float alpha, SkXfermode::Mode mode, bool blend); /** * Draws a textured rectangle with the specified texture. The specified coordinates Loading @@ -191,10 +190,9 @@ private: * @param bottom The bottom coordinate of the rectangle * @param texture The texture to use * @param paint The paint containing the alpha, blending mode, etc. * @param isPremultiplied Indicates whether the texture has premultiplied alpha */ void drawTextureRect(float left, float top, float right, float bottom, const Texture* texture, const SkPaint* paint, bool isPremultiplied = true); void drawTextureRect(float left, float top, float right, float bottom, const Texture* texture, const SkPaint* paint); /** * Draws a textured mesh with the specified texture. If the indices are omitted, the Loading @@ -208,14 +206,13 @@ private: * @param alpha An additional translucency parameter, between 0.0f and 1.0f * @param mode The blending mode * @param blend True if the texture contains an alpha channel * @param isPremultiplied Indicates whether the texture has premultiplied alpha * @param vertices The vertices that define the mesh * @param texCoords The texture coordinates of each vertex * @param indices The indices of the vertices, can be NULL * @param elementsCount The number of elements in the mesh, required by indices */ void drawTextureMesh(float left, float top, float right, float bottom, GLuint texture, float alpha, SkXfermode::Mode mode, bool blend, bool isPremultiplied, float alpha, SkXfermode::Mode mode, bool blend, GLvoid* vertices, GLvoid* texCoords, GLvoid* indices, GLsizei elementsCount = 0); /** Loading Loading @@ -245,7 +242,7 @@ private: * Enable or disable blending as necessary. This function sets the appropriate * blend function based on the specified xfermode. */ inline void chooseBlending(bool blend, SkXfermode::Mode mode, bool isPremultiplied); inline void chooseBlending(bool blend, SkXfermode::Mode mode, bool isPremultiplied = true); /** * Use the specified shader with the current GL context. If the shader is already Loading Loading
libs/hwui/OpenGLRenderer.cpp +13 −18 Original line number Diff line number Diff line Loading @@ -243,7 +243,7 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { const Rect& rect = layer->layer; drawTextureRect(rect.left, rect.top, rect.right, rect.bottom, layer->texture, layer->alpha, layer->mode, layer->blend, true); layer->texture, layer->alpha, layer->mode, layer->blend); LayerSize size(rect.getWidth(), rect.getHeight()); // Failing to add the layer to the cache should happen only if the Loading Loading @@ -486,8 +486,8 @@ void OpenGLRenderer::drawPatch(SkBitmap* bitmap, Res_png_9patch* patch, // Specify right and bottom as +1.0f from left/top to prevent scaling since the // patch mesh already defines the final size drawTextureMesh(left, top, left + 1.0f, top + 1.0f, texture->id, alpha / 255.0f, mode, texture->blend, true, &mesh->vertices[0].position[0], drawTextureMesh(left, top, left + 1.0f, top + 1.0f, texture->id, alpha / 255.0f, mode, texture->blend, &mesh->vertices[0].position[0], &mesh->vertices[0].texture[0], mesh->indices, mesh->indicesCount); } Loading Loading @@ -532,7 +532,7 @@ void OpenGLRenderer::drawColorRect(float left, float top, float right, float bot const GLfloat b = ((color ) & 0xFF) / 255.0f; // Pre-multiplication happens when setting the shader color chooseBlending(alpha < 255, mode, true); chooseBlending(alpha < 255, mode); mModelView.loadTranslate(left, top, 0.0f); mModelView.scale(right - left, bottom - top, 1.0f); Loading @@ -552,24 +552,23 @@ void OpenGLRenderer::drawColorRect(float left, float top, float right, float bot } void OpenGLRenderer::drawTextureRect(float left, float top, float right, float bottom, const Texture* texture, const SkPaint* paint, bool isPremultiplied) { const Texture* texture, const SkPaint* paint) { int alpha; SkXfermode::Mode mode; getAlphaAndMode(paint, &alpha, &mode); drawTextureMesh(left, top, right, bottom, texture->id, alpha / 255.0f, mode, texture->blend, isPremultiplied, &mDrawTextureVertices[0].position[0], &mDrawTextureVertices[0].texture[0], NULL); drawTextureMesh(left, top, right, bottom, texture->id, alpha / 255.0f, mode, texture->blend, &mDrawTextureVertices[0].position[0], &mDrawTextureVertices[0].texture[0], NULL); } void OpenGLRenderer::drawTextureRect(float left, float top, float right, float bottom, GLuint texture, float alpha, SkXfermode::Mode mode, bool blend, bool isPremultiplied) { drawTextureMesh(left, top, right, bottom, texture, alpha, mode, blend, isPremultiplied, GLuint texture, float alpha, SkXfermode::Mode mode, bool blend) { drawTextureMesh(left, top, right, bottom, texture, alpha, mode, blend, &mDrawTextureVertices[0].position[0], &mDrawTextureVertices[0].texture[0], NULL); } void OpenGLRenderer::drawTextureMesh(float left, float top, float right, float bottom, GLuint texture, float alpha, SkXfermode::Mode mode, bool blend, bool isPremultiplied, GLuint texture, float alpha, SkXfermode::Mode mode, bool blend, GLvoid* vertices, GLvoid* texCoords, GLvoid* indices, GLsizei elementsCount) { mModelView.loadTranslate(left, top, 0.0f); mModelView.scale(right - left, bottom - top, 1.0f); Loading @@ -577,17 +576,14 @@ void OpenGLRenderer::drawTextureMesh(float left, float top, float right, float b useShader(mDrawTextureShader); mDrawTextureShader->set(mOrthoMatrix, mModelView, mSnapshot->transform); chooseBlending(blend || alpha < 1.0f, mode, isPremultiplied); chooseBlending(blend || alpha < 1.0f, mode); glBindTexture(GL_TEXTURE_2D, texture); // TODO handle tiling and filtering here if (isPremultiplied) { // Always premultiplied glUniform4f(mDrawTextureShader->color, alpha, alpha, alpha, alpha); } else { glUniform4f(mDrawTextureShader->color, 1.0f, 1.0f, 1.0f, alpha); } glVertexAttribPointer(mDrawTextureShader->position, 2, GL_FLOAT, GL_FALSE, gDrawTextureVertexStride, vertices); Loading @@ -597,7 +593,6 @@ void OpenGLRenderer::drawTextureMesh(float left, float top, float right, float b if (!indices) { glDrawArrays(GL_TRIANGLE_STRIP, 0, gDrawTextureVertexCount); } else { // TODO: Use triangle strip instead glDrawElements(GL_TRIANGLES, elementsCount, GL_UNSIGNED_SHORT, indices); } Loading
libs/hwui/OpenGLRenderer.h +5 −8 Original line number Diff line number Diff line Loading @@ -176,10 +176,9 @@ private: * @param alpha An additional translucency parameter, between 0.0f and 1.0f * @param mode The blending mode * @param blend True if the texture contains an alpha channel * @param isPremultiplied Indicates whether the texture has premultiplied alpha */ void drawTextureRect(float left, float top, float right, float bottom, GLuint texture, float alpha, SkXfermode::Mode mode, bool blend, bool isPremultiplied = true); float alpha, SkXfermode::Mode mode, bool blend); /** * Draws a textured rectangle with the specified texture. The specified coordinates Loading @@ -191,10 +190,9 @@ private: * @param bottom The bottom coordinate of the rectangle * @param texture The texture to use * @param paint The paint containing the alpha, blending mode, etc. * @param isPremultiplied Indicates whether the texture has premultiplied alpha */ void drawTextureRect(float left, float top, float right, float bottom, const Texture* texture, const SkPaint* paint, bool isPremultiplied = true); void drawTextureRect(float left, float top, float right, float bottom, const Texture* texture, const SkPaint* paint); /** * Draws a textured mesh with the specified texture. If the indices are omitted, the Loading @@ -208,14 +206,13 @@ private: * @param alpha An additional translucency parameter, between 0.0f and 1.0f * @param mode The blending mode * @param blend True if the texture contains an alpha channel * @param isPremultiplied Indicates whether the texture has premultiplied alpha * @param vertices The vertices that define the mesh * @param texCoords The texture coordinates of each vertex * @param indices The indices of the vertices, can be NULL * @param elementsCount The number of elements in the mesh, required by indices */ void drawTextureMesh(float left, float top, float right, float bottom, GLuint texture, float alpha, SkXfermode::Mode mode, bool blend, bool isPremultiplied, float alpha, SkXfermode::Mode mode, bool blend, GLvoid* vertices, GLvoid* texCoords, GLvoid* indices, GLsizei elementsCount = 0); /** Loading Loading @@ -245,7 +242,7 @@ private: * Enable or disable blending as necessary. This function sets the appropriate * blend function based on the specified xfermode. */ inline void chooseBlending(bool blend, SkXfermode::Mode mode, bool isPremultiplied); inline void chooseBlending(bool blend, SkXfermode::Mode mode, bool isPremultiplied = true); /** * Use the specified shader with the current GL context. If the shader is already Loading