void nsWindow::DoDraw(void) { if (!hal::GetScreenEnabled()) { gDrawRequest = true; return; } if (!gWindowToRedraw) { LOG(" no window to draw, bailing"); return; } nsPaintEvent event(true, NS_PAINT, gWindowToRedraw); event.region = gWindowToRedraw->mDirtyRegion; gWindowToRedraw->mDirtyRegion.SetEmpty(); LayerManager* lm = gWindowToRedraw->GetLayerManager(); if (LayerManager::LAYERS_OPENGL == lm->GetBackendType()) { LayerManagerOGL* oglm = static_cast<LayerManagerOGL*>(lm); oglm->SetClippingRegion(event.region); oglm->SetWorldTransform(sRotationMatrix); gWindowToRedraw->mEventCallback(&event); } else if (LayerManager::LAYERS_BASIC == lm->GetBackendType()) { MOZ_ASSERT(sFramebufferOpen); nsRefPtr<gfxASurface> backBuffer = Framebuffer::BackBuffer(); { nsRefPtr<gfxContext> ctx = new gfxContext(backBuffer); gfxUtils::PathFromRegion(ctx, event.region); ctx->Clip(); // No double-buffering needed. AutoLayerManagerSetup setupLayerManager( gWindowToRedraw, ctx, BasicLayerManager::BUFFER_NONE); gWindowToRedraw->mEventCallback(&event); } backBuffer->Flush(); Framebuffer::Present(event.region); } else { NS_RUNTIMEABORT("Unexpected layer manager type"); } }
void nsWindow::DoDraw(void) { if (!hal::GetScreenEnabled()) { gDrawRequest = true; return; } if (!gWindowToRedraw) { LOG(" no window to draw, bailing"); return; } nsIntRegion region = gWindowToRedraw->mDirtyRegion; gWindowToRedraw->mDirtyRegion.SetEmpty(); nsIWidgetListener* listener = gWindowToRedraw->GetWidgetListener(); if (listener) { listener->WillPaintWindow(gWindowToRedraw); } LayerManager* lm = gWindowToRedraw->GetLayerManager(); if (mozilla::layers::LAYERS_OPENGL == lm->GetBackendType()) { LayerManagerOGL* oglm = static_cast<LayerManagerOGL*>(lm); oglm->SetClippingRegion(region); oglm->SetWorldTransform(sRotationMatrix); listener = gWindowToRedraw->GetWidgetListener(); if (listener) { listener->PaintWindow(gWindowToRedraw, region); } } else if (mozilla::layers::LAYERS_CLIENT == lm->GetBackendType()) { // No need to do anything, the compositor will handle drawing } else if (mozilla::layers::LAYERS_BASIC == lm->GetBackendType()) { MOZ_ASSERT(sFramebufferOpen || sUsingOMTC); nsRefPtr<gfxASurface> targetSurface; if(sUsingOMTC) targetSurface = sOMTCSurface; else targetSurface = Framebuffer::BackBuffer(); { nsRefPtr<gfxContext> ctx = new gfxContext(targetSurface); gfxUtils::PathFromRegion(ctx, region); ctx->Clip(); // No double-buffering needed. AutoLayerManagerSetup setupLayerManager( gWindowToRedraw, ctx, mozilla::layers::BUFFER_NONE, ScreenRotation(EffectiveScreenRotation())); listener = gWindowToRedraw->GetWidgetListener(); if (listener) { listener->PaintWindow(gWindowToRedraw, region); } } if (!sUsingOMTC) { targetSurface->Flush(); Framebuffer::Present(region); } } else { NS_RUNTIMEABORT("Unexpected layer manager type"); } listener = gWindowToRedraw->GetWidgetListener(); if (listener) { listener->DidPaintWindow(); } }