Loading libs/hwui/Layer.h +5 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,11 @@ struct Layer { * have been drawn. */ Region region; /** * If the region is a rectangle, coordinates of the * region are stored here. */ Rect regionRect; /** * Color filter used to draw this layer. Optional. Loading libs/hwui/LayerRenderer.cpp +14 −4 Original line number Diff line number Diff line Loading @@ -92,11 +92,7 @@ Region* LayerRenderer::getRegion() { void LayerRenderer::generateMesh() { #if RENDER_LAYERS_AS_REGIONS #if RENDER_LAYERS_RECT_AS_RECT if (mLayer->region.isRect() || mLayer->region.isEmpty()) { #else if (mLayer->region.isEmpty()) { #endif if (mLayer->mesh) { delete mLayer->mesh; delete mLayer->meshIndices; Loading @@ -105,6 +101,20 @@ void LayerRenderer::generateMesh() { mLayer->meshIndices = NULL; mLayer->meshElementCount = 0; } const android::Rect& bounds = mLayer->region.getBounds(); mLayer->regionRect.set(bounds.leftTop().x, bounds.leftTop().y, bounds.rightBottom().x, bounds.rightBottom().y); const float texX = 1.0f / float(mLayer->width); const float texY = 1.0f / float(mLayer->height); const float height = mLayer->layer.getHeight(); mLayer->texCoords.set( mLayer->regionRect.left * texX, (height - mLayer->regionRect.top) * texY, mLayer->regionRect.right * texX, (height - mLayer->regionRect.bottom) * texY); return; } Loading libs/hwui/OpenGLRenderer.cpp +4 −13 Original line number Diff line number Diff line Loading @@ -646,13 +646,11 @@ void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap) void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) { #if RENDER_LAYERS_AS_REGIONS #if RENDER_LAYERS_RECT_AS_RECT if (layer->region.isRect()) { composeLayerRect(layer, rect); composeLayerRect(layer, layer->regionRect); layer->region.clear(); return; } #endif if (!layer->region.isEmpty()) { size_t count; Loading Loading @@ -1658,14 +1656,9 @@ void OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { #if RENDER_LAYERS_AS_REGIONS if (!layer->region.isEmpty()) { #if RENDER_LAYERS_RECT_AS_RECT if (layer->region.isRect()) { const Rect r(x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight()); composeLayerRect(layer, r); composeLayerRect(layer, layer->regionRect); } else if (layer->mesh) { #else if (layer->mesh) { #endif const float a = alpha / 255.0f; const Rect& rect = layer->layer; Loading @@ -1675,13 +1668,11 @@ void OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { setupDrawColorFilter(); setupDrawBlending(layer->blend || layer->alpha < 255, layer->mode, false); setupDrawProgram(); setupDrawModelViewTranslate(x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight()); setupDrawPureColorUniforms(); setupDrawColorFilterUniforms(); setupDrawTexture(layer->texture); // TODO: The current layer, if any, will be dirtied with the bounding box // of the layer we are drawing. Since the layer we are drawing has // a mesh, we know the dirty region, we should use it instead setupDrawModelViewTranslate(rect.left, rect.top, rect.right, rect.bottom); setupDrawMesh(&layer->mesh[0].position[0], &layer->mesh[0].texture[0]); glDrawElements(GL_TRIANGLES, layer->meshElementCount, Loading libs/hwui/Properties.h +0 −2 Original line number Diff line number Diff line Loading @@ -27,8 +27,6 @@ // If turned on, layers drawn inside FBOs are optimized with regions #define RENDER_LAYERS_AS_REGIONS 1 // If turned on, layers that map to a single rect are drawn as a rect #define RENDER_LAYERS_RECT_AS_RECT 0 /** * Debug level for app developers. Loading Loading
libs/hwui/Layer.h +5 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,11 @@ struct Layer { * have been drawn. */ Region region; /** * If the region is a rectangle, coordinates of the * region are stored here. */ Rect regionRect; /** * Color filter used to draw this layer. Optional. Loading
libs/hwui/LayerRenderer.cpp +14 −4 Original line number Diff line number Diff line Loading @@ -92,11 +92,7 @@ Region* LayerRenderer::getRegion() { void LayerRenderer::generateMesh() { #if RENDER_LAYERS_AS_REGIONS #if RENDER_LAYERS_RECT_AS_RECT if (mLayer->region.isRect() || mLayer->region.isEmpty()) { #else if (mLayer->region.isEmpty()) { #endif if (mLayer->mesh) { delete mLayer->mesh; delete mLayer->meshIndices; Loading @@ -105,6 +101,20 @@ void LayerRenderer::generateMesh() { mLayer->meshIndices = NULL; mLayer->meshElementCount = 0; } const android::Rect& bounds = mLayer->region.getBounds(); mLayer->regionRect.set(bounds.leftTop().x, bounds.leftTop().y, bounds.rightBottom().x, bounds.rightBottom().y); const float texX = 1.0f / float(mLayer->width); const float texY = 1.0f / float(mLayer->height); const float height = mLayer->layer.getHeight(); mLayer->texCoords.set( mLayer->regionRect.left * texX, (height - mLayer->regionRect.top) * texY, mLayer->regionRect.right * texX, (height - mLayer->regionRect.bottom) * texY); return; } Loading
libs/hwui/OpenGLRenderer.cpp +4 −13 Original line number Diff line number Diff line Loading @@ -646,13 +646,11 @@ void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap) void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) { #if RENDER_LAYERS_AS_REGIONS #if RENDER_LAYERS_RECT_AS_RECT if (layer->region.isRect()) { composeLayerRect(layer, rect); composeLayerRect(layer, layer->regionRect); layer->region.clear(); return; } #endif if (!layer->region.isEmpty()) { size_t count; Loading Loading @@ -1658,14 +1656,9 @@ void OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { #if RENDER_LAYERS_AS_REGIONS if (!layer->region.isEmpty()) { #if RENDER_LAYERS_RECT_AS_RECT if (layer->region.isRect()) { const Rect r(x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight()); composeLayerRect(layer, r); composeLayerRect(layer, layer->regionRect); } else if (layer->mesh) { #else if (layer->mesh) { #endif const float a = alpha / 255.0f; const Rect& rect = layer->layer; Loading @@ -1675,13 +1668,11 @@ void OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { setupDrawColorFilter(); setupDrawBlending(layer->blend || layer->alpha < 255, layer->mode, false); setupDrawProgram(); setupDrawModelViewTranslate(x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight()); setupDrawPureColorUniforms(); setupDrawColorFilterUniforms(); setupDrawTexture(layer->texture); // TODO: The current layer, if any, will be dirtied with the bounding box // of the layer we are drawing. Since the layer we are drawing has // a mesh, we know the dirty region, we should use it instead setupDrawModelViewTranslate(rect.left, rect.top, rect.right, rect.bottom); setupDrawMesh(&layer->mesh[0].position[0], &layer->mesh[0].texture[0]); glDrawElements(GL_TRIANGLES, layer->meshElementCount, Loading
libs/hwui/Properties.h +0 −2 Original line number Diff line number Diff line Loading @@ -27,8 +27,6 @@ // If turned on, layers drawn inside FBOs are optimized with regions #define RENDER_LAYERS_AS_REGIONS 1 // If turned on, layers that map to a single rect are drawn as a rect #define RENDER_LAYERS_RECT_AS_RECT 0 /** * Debug level for app developers. Loading