void BaseLayerAndroid::updatePositionsRecursive(const SkRect& visibleContentRect)
{
    TRACE_METHOD();

    updateLayerPositions(visibleContentRect);
    TransformationMatrix ident;

    // Start with an unnecessarily large clip, since the base layer can
    // dynamically increase in size to cover the viewport, and we cache its draw
    // clip. This way the base layer will never have it's visible area clipped
    // by its m_clippingRect, only the viewport.
    // Note: values larger than this suffer from floating point rounding issues
    FloatRect clip(0, 0, 1e7, 1e7);

    bool forcePositionCalculation = !m_positionsCalculated;
    float scale = 1.0f;
    // To minimize tearing in single surface mode, don't update the fixed element
    // when scrolling. The fixed element will move incorrectly when scrolling,
    // but its position will be corrected after scrolling.
    bool disableFixedElemUpdate = false;
    GLWebViewState* webViewState = state();
    if (webViewState) {
        scale = webViewState->scale();
        disableFixedElemUpdate = webViewState->isScrolling()
                                 && webViewState->isSingleSurfaceRenderingMode();
    }
    updateGLPositionsAndScale(ident, clip, 1, scale, forcePositionCalculation,
                              disableFixedElemUpdate);

    m_positionsCalculated = true;
}
void SurfaceCollection::prepareGL(const SkRect& visibleContentRect, bool tryToFastBlit)
{
    TRACE_METHOD();
    updateLayerPositions(visibleContentRect);
    bool layerTilesDisabled = m_compositedRoot->state()->isSingleSurfaceRenderingMode();
    if (!layerTilesDisabled) {
        for (unsigned int i = 0; tryToFastBlit && i < m_surfaces.size(); i++)
            tryToFastBlit &= m_surfaces[i]->canUpdateWithBlit();
    }
    for (unsigned int i = 0; i < m_surfaces.size(); i++)
        m_surfaces[i]->prepareGL(layerTilesDisabled, tryToFastBlit);
}
bool SurfaceCollection::drawGL(const SkRect& visibleContentRect)
{
    TRACE_METHOD();
#ifdef DEBUG_COUNT
    ClassTracker::instance()->show();
#endif

    bool needsRedraw = false;
    updateLayerPositions(visibleContentRect);
    bool layerTilesDisabled = m_compositedRoot->state()->isSingleSurfaceRenderingMode();

    // create a duplicate vector of surfaces, sorted by z value
    Vector <Surface*> surfaces;
    for (unsigned int i = 0; i < m_surfaces.size(); i++)
        surfaces.append(m_surfaces[i]);
    std::stable_sort(surfaces.begin()+1, surfaces.end(), compareSurfaceZ);

    // draw the sorted vector
    for (unsigned int i = 0; i < m_surfaces.size(); i++)
        needsRedraw |= surfaces[i]->drawGL(layerTilesDisabled);

    return needsRedraw;
}