Loading core/java/android/view/GLES20Canvas.java +0 −1 Original line number Diff line number Diff line Loading @@ -403,7 +403,6 @@ class GLES20Canvas extends Canvas { @Override public void drawBitmap(int[] colors, int offset, int stride, float x, float y, int width, int height, boolean hasAlpha, Paint paint) { // TODO: Implement } Loading core/jni/android_view_GLES20Canvas.cpp +7 −3 Original line number Diff line number Diff line Loading @@ -196,9 +196,13 @@ static void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject canvas float srcLeft, float srcTop, float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight, float dstBottom, SkMatrix* matrix, SkPaint* paint, jint bitmapDenstiy, jint canvasDensity, jint screenDensity) { // TODO: Implement! LOGE("Not implemented: drawBitmap(IIFFFFFFFFIIIII)V"); jint bitmapDensity, jint canvasDensity, jint screenDensity) { if (canvasDensity == bitmapDensity || canvasDensity == 0 || bitmapDensity == 0) { renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom, dstLeft, dstTop, dstRight, dstBottom, matrix, paint); } else { } } static void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject canvas, Loading libs/hwui/OpenGLRenderer.cpp +57 −24 Original line number Diff line number Diff line Loading @@ -205,12 +205,12 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { const float u2 = texCoords.right / float(mWidth); const float v2 = (mHeight - texCoords.bottom) / float(mHeight); resetDrawTextureTexCoords(u1, v1, u2, v1); resetDrawTextureTexCoords(u1, v1, u2, v2); drawTextureRect(layer.left, layer.top, layer.right, layer.bottom, current->texture, current->alpha, current->mode, true, true); resetDrawTextureTexCoords(0.0f, 1.0f, 1.0f, 0.0f); resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); glDeleteFramebuffers(1, ¤t->fbo); glDeleteTextures(1, ¤t->texture); Loading Loading @@ -263,9 +263,11 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, // The FBO will not be scaled, so we can use lower quality filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // TODO VERY IMPORTANT: Fix TextView to not call saveLayer() all the time // TODO ***** IMPORTANT ***** // Creating a texture-backed FBO works only if the texture is the same size // as the original rendering buffer (in this case, mWidth and mHeight.) Loading Loading @@ -381,30 +383,40 @@ bool OpenGLRenderer::clipRect(float left, float top, float right, float bottom) void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, const SkPaint* paint) { Texture* texture = mTextureCache.get(bitmap); SkXfermode::Mode mode; int alpha; SkXfermode::Mode mode; getAlphaAndMode(paint, &alpha, &mode); if (paint) { const bool isMode = SkXfermode::IsMode(paint->getXfermode(), &mode); if (!isMode) { // Assume SRC_OVER mode = SkXfermode::kSrcOver_Mode; drawTextureRect(left, top, left + texture->width, top + texture->height, texture->id, alpha / 255.0f, mode, texture->blend, true); } // Skia draws using the color's alpha channel if < 255 // Otherwise, it uses the paint's alpha int color = paint->getColor(); alpha = (color >> 24) & 0xFF; if (alpha == 255) { alpha = paint->getAlpha(); } } else { mode = SkXfermode::kSrcOver_Mode; alpha = 255; } void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight, float dstBottom, const SkMatrix* matrix, const SkPaint* paint) { Texture* texture = mTextureCache.get(bitmap); drawTextureRect(left, top, left + texture->width, top + texture->height, texture->id, int alpha; SkXfermode::Mode mode; getAlphaAndMode(paint, &alpha, &mode); const float width = texture->width; const float height = texture->height; const float u1 = srcLeft / width; const float v1 = srcTop / height; const float u2 = srcRight / width; const float v2 = srcBottom / height; resetDrawTextureTexCoords(u1, v1, u2, v2); // TODO: implement Matrix drawTextureRect(dstLeft, dstTop, dstRight, dstBottom, texture->id, alpha / 255.0f, mode, texture->blend, true); resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); } void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) { Loading Loading @@ -515,13 +527,34 @@ void OpenGLRenderer::drawTextureRect(float left, float top, float right, float b void OpenGLRenderer::resetDrawTextureTexCoords(float u1, float v1, float u2, float v2) { mDrawTextureVertices[0].texture[0] = u1; mDrawTextureVertices[0].texture[1] = v2; mDrawTextureVertices[0].texture[1] = v1; mDrawTextureVertices[1].texture[0] = u2; mDrawTextureVertices[1].texture[1] = v2; mDrawTextureVertices[1].texture[1] = v1; mDrawTextureVertices[2].texture[0] = u1; mDrawTextureVertices[2].texture[1] = v1; mDrawTextureVertices[2].texture[1] = v2; mDrawTextureVertices[3].texture[0] = u2; mDrawTextureVertices[3].texture[1] = v1; mDrawTextureVertices[3].texture[1] = v2; } void OpenGLRenderer::getAlphaAndMode(const SkPaint* paint, int* alpha, SkXfermode::Mode* mode) { if (paint) { const bool isMode = SkXfermode::IsMode(paint->getXfermode(), mode); if (!isMode) { // Assume SRC_OVER *mode = SkXfermode::kSrcOver_Mode; } // Skia draws using the color's alpha channel if < 255 // Otherwise, it uses the paint's alpha int color = paint->getColor(); *alpha = (color >> 24) & 0xFF; if (*alpha == 255) { *alpha = paint->getAlpha(); } } else { *mode = SkXfermode::kSrcOver_Mode; *alpha = 255; } } }; // namespace uirenderer Loading libs/hwui/OpenGLRenderer.h +14 −1 Original line number Diff line number Diff line Loading @@ -103,6 +103,9 @@ public: bool clipRect(float left, float top, float right, float bottom); void drawBitmap(SkBitmap* bitmap, float left, float top, const SkPaint* paint); void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight, float dstBottom, const SkMatrix* matrix, const SkPaint* paint); void drawColor(int color, SkXfermode::Mode mode); void drawRect(float left, float top, float right, float bottom, const SkPaint* paint); Loading Loading @@ -193,7 +196,7 @@ private: * Resets the texture coordinates stored in mDrawTextureVertices. Setting the values * back to default is achieved by calling: * * resetDrawTextureTexCoords(0.0f, 1.0f, 1.0f, 0.0f); * resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); * * @param u1 The left coordinate of the texture * @param v1 The bottom coordinate of the texture Loading @@ -202,6 +205,16 @@ private: */ void resetDrawTextureTexCoords(float u1, float v1, float u2, float v2); /** * Gets the alpha and xfermode out of a paint object. If the paint is null * alpha will be 255 and the xfermode will be SRC_OVER. * * @param paint The paint to extract values from * @param alpha Where to store the resulting alpha * @param mode Where to store the resulting xfermode */ inline void getAlphaAndMode(const SkPaint* paint, int* alpha, SkXfermode::Mode* mode); // Dimensions of the drawing surface int mWidth, mHeight; Loading libs/hwui/TextureCache.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ void TextureCache::generateTexture(SkBitmap* bitmap, Texture* texture, bool rege glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); Loading Loading
core/java/android/view/GLES20Canvas.java +0 −1 Original line number Diff line number Diff line Loading @@ -403,7 +403,6 @@ class GLES20Canvas extends Canvas { @Override public void drawBitmap(int[] colors, int offset, int stride, float x, float y, int width, int height, boolean hasAlpha, Paint paint) { // TODO: Implement } Loading
core/jni/android_view_GLES20Canvas.cpp +7 −3 Original line number Diff line number Diff line Loading @@ -196,9 +196,13 @@ static void android_view_GLES20Canvas_drawBitmapRect(JNIEnv* env, jobject canvas float srcLeft, float srcTop, float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight, float dstBottom, SkMatrix* matrix, SkPaint* paint, jint bitmapDenstiy, jint canvasDensity, jint screenDensity) { // TODO: Implement! LOGE("Not implemented: drawBitmap(IIFFFFFFFFIIIII)V"); jint bitmapDensity, jint canvasDensity, jint screenDensity) { if (canvasDensity == bitmapDensity || canvasDensity == 0 || bitmapDensity == 0) { renderer->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom, dstLeft, dstTop, dstRight, dstBottom, matrix, paint); } else { } } static void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject canvas, Loading
libs/hwui/OpenGLRenderer.cpp +57 −24 Original line number Diff line number Diff line Loading @@ -205,12 +205,12 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { const float u2 = texCoords.right / float(mWidth); const float v2 = (mHeight - texCoords.bottom) / float(mHeight); resetDrawTextureTexCoords(u1, v1, u2, v1); resetDrawTextureTexCoords(u1, v1, u2, v2); drawTextureRect(layer.left, layer.top, layer.right, layer.bottom, current->texture, current->alpha, current->mode, true, true); resetDrawTextureTexCoords(0.0f, 1.0f, 1.0f, 0.0f); resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); glDeleteFramebuffers(1, ¤t->fbo); glDeleteTextures(1, ¤t->texture); Loading Loading @@ -263,9 +263,11 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, // The FBO will not be scaled, so we can use lower quality filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // TODO VERY IMPORTANT: Fix TextView to not call saveLayer() all the time // TODO ***** IMPORTANT ***** // Creating a texture-backed FBO works only if the texture is the same size // as the original rendering buffer (in this case, mWidth and mHeight.) Loading Loading @@ -381,30 +383,40 @@ bool OpenGLRenderer::clipRect(float left, float top, float right, float bottom) void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, const SkPaint* paint) { Texture* texture = mTextureCache.get(bitmap); SkXfermode::Mode mode; int alpha; SkXfermode::Mode mode; getAlphaAndMode(paint, &alpha, &mode); if (paint) { const bool isMode = SkXfermode::IsMode(paint->getXfermode(), &mode); if (!isMode) { // Assume SRC_OVER mode = SkXfermode::kSrcOver_Mode; drawTextureRect(left, top, left + texture->width, top + texture->height, texture->id, alpha / 255.0f, mode, texture->blend, true); } // Skia draws using the color's alpha channel if < 255 // Otherwise, it uses the paint's alpha int color = paint->getColor(); alpha = (color >> 24) & 0xFF; if (alpha == 255) { alpha = paint->getAlpha(); } } else { mode = SkXfermode::kSrcOver_Mode; alpha = 255; } void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight, float dstBottom, const SkMatrix* matrix, const SkPaint* paint) { Texture* texture = mTextureCache.get(bitmap); drawTextureRect(left, top, left + texture->width, top + texture->height, texture->id, int alpha; SkXfermode::Mode mode; getAlphaAndMode(paint, &alpha, &mode); const float width = texture->width; const float height = texture->height; const float u1 = srcLeft / width; const float v1 = srcTop / height; const float u2 = srcRight / width; const float v2 = srcBottom / height; resetDrawTextureTexCoords(u1, v1, u2, v2); // TODO: implement Matrix drawTextureRect(dstLeft, dstTop, dstRight, dstBottom, texture->id, alpha / 255.0f, mode, texture->blend, true); resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); } void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) { Loading Loading @@ -515,13 +527,34 @@ void OpenGLRenderer::drawTextureRect(float left, float top, float right, float b void OpenGLRenderer::resetDrawTextureTexCoords(float u1, float v1, float u2, float v2) { mDrawTextureVertices[0].texture[0] = u1; mDrawTextureVertices[0].texture[1] = v2; mDrawTextureVertices[0].texture[1] = v1; mDrawTextureVertices[1].texture[0] = u2; mDrawTextureVertices[1].texture[1] = v2; mDrawTextureVertices[1].texture[1] = v1; mDrawTextureVertices[2].texture[0] = u1; mDrawTextureVertices[2].texture[1] = v1; mDrawTextureVertices[2].texture[1] = v2; mDrawTextureVertices[3].texture[0] = u2; mDrawTextureVertices[3].texture[1] = v1; mDrawTextureVertices[3].texture[1] = v2; } void OpenGLRenderer::getAlphaAndMode(const SkPaint* paint, int* alpha, SkXfermode::Mode* mode) { if (paint) { const bool isMode = SkXfermode::IsMode(paint->getXfermode(), mode); if (!isMode) { // Assume SRC_OVER *mode = SkXfermode::kSrcOver_Mode; } // Skia draws using the color's alpha channel if < 255 // Otherwise, it uses the paint's alpha int color = paint->getColor(); *alpha = (color >> 24) & 0xFF; if (*alpha == 255) { *alpha = paint->getAlpha(); } } else { *mode = SkXfermode::kSrcOver_Mode; *alpha = 255; } } }; // namespace uirenderer Loading
libs/hwui/OpenGLRenderer.h +14 −1 Original line number Diff line number Diff line Loading @@ -103,6 +103,9 @@ public: bool clipRect(float left, float top, float right, float bottom); void drawBitmap(SkBitmap* bitmap, float left, float top, const SkPaint* paint); void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight, float dstBottom, const SkMatrix* matrix, const SkPaint* paint); void drawColor(int color, SkXfermode::Mode mode); void drawRect(float left, float top, float right, float bottom, const SkPaint* paint); Loading Loading @@ -193,7 +196,7 @@ private: * Resets the texture coordinates stored in mDrawTextureVertices. Setting the values * back to default is achieved by calling: * * resetDrawTextureTexCoords(0.0f, 1.0f, 1.0f, 0.0f); * resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); * * @param u1 The left coordinate of the texture * @param v1 The bottom coordinate of the texture Loading @@ -202,6 +205,16 @@ private: */ void resetDrawTextureTexCoords(float u1, float v1, float u2, float v2); /** * Gets the alpha and xfermode out of a paint object. If the paint is null * alpha will be 255 and the xfermode will be SRC_OVER. * * @param paint The paint to extract values from * @param alpha Where to store the resulting alpha * @param mode Where to store the resulting xfermode */ inline void getAlphaAndMode(const SkPaint* paint, int* alpha, SkXfermode::Mode* mode); // Dimensions of the drawing surface int mWidth, mHeight; Loading
libs/hwui/TextureCache.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ void TextureCache::generateTexture(SkBitmap* bitmap, Texture* texture, bool rege glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); Loading