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; }