bool TreeManager::drawGL(double currentTime, IntRect& viewRect,
                         SkRect& visibleRect, float scale,
                         bool enterFastSwapMode, bool* treesSwappedPtr, bool* newTreeHasAnimPtr,
                         TexturesResult* texturesResultPtr)
{
    m_fastSwapMode |= enterFastSwapMode;

    XLOG("drawGL, D %p, P %p, Q %p, fastSwap %d",
         m_drawingTree, m_paintingTree, m_queuedTree, m_fastSwapMode);

    bool ret = false;
    bool didTreeSwap = false;
    if (m_paintingTree) {
        XLOG("preparing painting tree %p", m_paintingTree);

        LayerAndroid* laTree = 0;
        if (m_paintingTree->countChildren()) {
            laTree = static_cast<LayerAndroid*>(m_paintingTree->getChild(0));
            ret |= laTree->evaluateAnimations(currentTime);
        }

        ret |= m_paintingTree->prepare(currentTime, viewRect,
                                       visibleRect, scale);

        if (laTree)
            laTree->computeTexturesAmount(texturesResultPtr);

        if (/*!m_fastSwapMode && */ m_paintingTree->isReady()) {
            XLOG("have painting tree %p ready, swapping!", m_paintingTree);
            didTreeSwap = true;
            swap();
            if (treesSwappedPtr)
                *treesSwappedPtr = true;
            if (laTree && newTreeHasAnimPtr)
                *newTreeHasAnimPtr = laTree->hasAnimations();
        }
    } else if (m_drawingTree) {
        XLOG("preparing drawing tree %p", m_drawingTree);
        ret |= m_drawingTree->prepare(currentTime, viewRect,
                                      visibleRect, scale);
        if (m_drawingTree->countChildren()) {
            LayerAndroid* laTree = static_cast<LayerAndroid*>(m_drawingTree->getChild(0));
            laTree->computeTexturesAmount(texturesResultPtr);
        }
    }


    if (m_drawingTree) {
        bool drawingReady = didTreeSwap || m_drawingTree->isReady();

        if (didTreeSwap || m_fastSwapMode || (drawingReady && !m_paintingTree))
            m_drawingTree->swapTiles();

        if (drawingReady) {
            // exit fast swap mode, as content is up to date
            m_fastSwapMode = false;
        } else {
            // drawing isn't ready, must redraw
            ret = true;
        }

        if (m_drawingTree->countChildren()) {
            LayerAndroid* laTree = static_cast<LayerAndroid*>(m_drawingTree->getChild(0));
            ret |= laTree->evaluateAnimations(currentTime);
        }
        XLOG("drawing tree %p", m_drawingTree);
        ret |= m_drawingTree->drawGL(viewRect, visibleRect, scale);
    } else if (m_paintingTree && m_paintingTree->state()) {
        // Dont have a drawing tree, draw white background
        Color defaultBackground = Color::white;
        m_paintingTree->state()->drawBackground(defaultBackground);
    }

    if (m_paintingTree) {
        XLOG("still have painting tree %p", m_paintingTree);
        return true;
    }

    return ret;
}