Index: ui/gfx/compositor/compositor.cc |
diff --git a/ui/gfx/compositor/compositor.cc b/ui/gfx/compositor/compositor.cc |
deleted file mode 100644 |
index 3a8942a46bc72b742d834a77b51c141e6fba20ed..0000000000000000000000000000000000000000 |
--- a/ui/gfx/compositor/compositor.cc |
+++ /dev/null |
@@ -1,354 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "ui/gfx/compositor/compositor.h" |
- |
-#include "base/command_line.h" |
-#include "base/threading/thread_restrictions.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositor.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebFloatPoint.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebRect.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebSize.h" |
-#include "third_party/skia/include/core/SkBitmap.h" |
-#include "third_party/skia/include/images/SkImageEncoder.h" |
-#include "ui/gfx/compositor/compositor_observer.h" |
-#include "ui/gfx/compositor/compositor_switches.h" |
-#include "ui/gfx/compositor/layer.h" |
-#include "ui/gfx/compositor/test_web_graphics_context_3d.h" |
-#include "ui/gfx/gl/gl_context.h" |
-#include "ui/gfx/gl/gl_implementation.h" |
-#include "ui/gfx/gl/gl_surface.h" |
-#include "webkit/glue/webthread_impl.h" |
-#include "webkit/gpu/webgraphicscontext3d_in_process_impl.h" |
- |
-namespace { |
- |
-const double kDefaultRefreshRate = 60.0; |
-const double kTestRefreshRate = 100.0; |
- |
-webkit_glue::WebThreadImpl* g_compositor_thread = NULL; |
- |
-bool test_compositor_enabled = false; |
- |
-ui::ContextFactory* g_context_factory = NULL; |
- |
-} // anonymous namespace |
- |
-namespace ui { |
- |
-// static |
-ContextFactory* ContextFactory::GetInstance() { |
- // We leak the shared resources so that we don't race with |
- // the tear down of the gl_bindings. |
- if (!g_context_factory) { |
- DVLOG(1) << "Using DefaultSharedResource"; |
- scoped_ptr<DefaultContextFactory> instance( |
- new DefaultContextFactory()); |
- if (instance->Initialize()) |
- g_context_factory = instance.release(); |
- } |
- return g_context_factory; |
-} |
- |
-// static |
-void ContextFactory::SetInstance(ContextFactory* instance) { |
- g_context_factory = instance; |
-} |
- |
-DefaultContextFactory::DefaultContextFactory() { |
-} |
- |
-DefaultContextFactory::~DefaultContextFactory() { |
-} |
- |
-bool DefaultContextFactory::Initialize() { |
- // The following line of code exists soley to disable IO restrictions |
- // on this thread long enough to perform the GL bindings. |
- // TODO(wjmaclean) Remove this when GL initialisation cleaned up. |
- base::ThreadRestrictions::ScopedAllowIO allow_io; |
- if (!gfx::GLSurface::InitializeOneOff() || |
- gfx::GetGLImplementation() == gfx::kGLImplementationNone) { |
- LOG(ERROR) << "Could not load the GL bindings"; |
- return false; |
- } |
- return true; |
-} |
- |
-WebKit::WebGraphicsContext3D* DefaultContextFactory::CreateContext( |
- Compositor* compositor) { |
- return CreateContextCommon(compositor, false); |
-} |
- |
-WebKit::WebGraphicsContext3D* DefaultContextFactory::CreateOffscreenContext( |
- Compositor* compositor) { |
- return CreateContextCommon(compositor, true); |
-} |
- |
-void DefaultContextFactory::RemoveCompositor(Compositor* compositor) { |
-} |
- |
-WebKit::WebGraphicsContext3D* DefaultContextFactory::CreateContextCommon( |
- Compositor* compositor, |
- bool offscreen) { |
- WebKit::WebGraphicsContext3D::Attributes attrs; |
- attrs.shareResources = true; |
- WebKit::WebGraphicsContext3D* context = |
- offscreen ? |
- webkit::gpu::WebGraphicsContext3DInProcessImpl::CreateForWebView( |
- attrs, false) : |
- webkit::gpu::WebGraphicsContext3DInProcessImpl::CreateForWindow( |
- attrs, compositor->widget(), share_group_.get()); |
- CommandLine* command_line = CommandLine::ForCurrentProcess(); |
- if (!command_line->HasSwitch(switches::kDisableUIVsync)) { |
- context->makeContextCurrent(); |
- gfx::GLContext* gl_context = gfx::GLContext::GetCurrent(); |
- gl_context->SetSwapInterval(1); |
- gl_context->ReleaseCurrent(NULL); |
- } |
- return context; |
-} |
- |
-Texture::Texture(bool flipped, const gfx::Size& size) |
- : texture_id_(0), |
- flipped_(flipped), |
- size_(size) { |
-} |
- |
-Texture::~Texture() { |
-} |
- |
-Compositor::Compositor(CompositorDelegate* delegate, |
- gfx::AcceleratedWidget widget, |
- const gfx::Size& size) |
- : delegate_(delegate), |
- size_(size), |
- root_layer_(NULL), |
- widget_(widget), |
- root_web_layer_(WebKit::WebLayer::create()), |
- swap_posted_(false) { |
- WebKit::WebLayerTreeView::Settings settings; |
- CommandLine* command_line = CommandLine::ForCurrentProcess(); |
- settings.showFPSCounter = |
- command_line->HasSwitch(switches::kUIShowFPSCounter); |
- settings.showPlatformLayerTree = |
- command_line->HasSwitch(switches::kUIShowLayerTree); |
- settings.refreshRate = test_compositor_enabled ? |
- kTestRefreshRate : kDefaultRefreshRate; |
- settings.partialSwapEnabled = |
- command_line->HasSwitch(switches::kUIEnablePartialSwap); |
- settings.perTilePainting = |
- command_line->HasSwitch(switches::kUIEnablePerTilePainting); |
- |
- host_.initialize(this, root_web_layer_, settings); |
- root_web_layer_.setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f)); |
- WidgetSizeChanged(size_); |
-} |
- |
-Compositor::~Compositor() { |
- // There's a cycle between |root_web_layer_| and |host_|, which results in |
- // leaking and/or crashing. Explicitly set the root layer to NULL so the cycle |
- // is broken. |
- host_.setRootLayer(NULL); |
- if (root_layer_) |
- root_layer_->SetCompositor(NULL); |
- if (!test_compositor_enabled) |
- ContextFactory::GetInstance()->RemoveCompositor(this); |
-} |
- |
-void Compositor::Initialize(bool use_thread) { |
- if (use_thread) |
- g_compositor_thread = new webkit_glue::WebThreadImpl("Browser Compositor"); |
- WebKit::WebCompositor::initialize(g_compositor_thread); |
-} |
- |
-void Compositor::Terminate() { |
- WebKit::WebCompositor::shutdown(); |
- if (g_compositor_thread) { |
- delete g_compositor_thread; |
- g_compositor_thread = NULL; |
- } |
-} |
- |
-void Compositor::ScheduleDraw() { |
- if (g_compositor_thread) { |
- // TODO(nduca): Temporary while compositor calls |
- // compositeImmediately() directly. |
- layout(); |
- host_.composite(); |
- } else { |
- delegate_->ScheduleDraw(); |
- } |
-} |
- |
-void Compositor::SetRootLayer(Layer* root_layer) { |
- if (root_layer_ == root_layer) |
- return; |
- if (root_layer_) |
- root_layer_->SetCompositor(NULL); |
- root_layer_ = root_layer; |
- if (root_layer_ && !root_layer_->GetCompositor()) |
- root_layer_->SetCompositor(this); |
- root_web_layer_.removeAllChildren(); |
- if (root_layer_) |
- root_web_layer_.addChild(root_layer_->web_layer()); |
-} |
- |
-void Compositor::Draw(bool force_clear) { |
- if (!root_layer_) |
- return; |
- |
- // TODO(nduca): Temporary while compositor calls |
- // compositeImmediately() directly. |
- layout(); |
- host_.composite(); |
- if (!g_compositor_thread && !swap_posted_) |
- NotifyEnd(); |
-} |
- |
-void Compositor::ScheduleFullDraw() { |
- host_.setNeedsRedraw(); |
-} |
- |
-bool Compositor::ReadPixels(SkBitmap* bitmap, const gfx::Rect& bounds) { |
- if (bounds.right() > size().width() || bounds.bottom() > size().height()) |
- return false; |
- // Convert to OpenGL coordinates. |
- gfx::Point new_origin(bounds.x(), |
- size().height() - bounds.height() - bounds.y()); |
- |
- bitmap->setConfig(SkBitmap::kARGB_8888_Config, |
- bounds.width(), bounds.height()); |
- bitmap->allocPixels(); |
- SkAutoLockPixels lock_image(*bitmap); |
- unsigned char* pixels = static_cast<unsigned char*>(bitmap->getPixels()); |
- if (host_.compositeAndReadback(pixels, |
- gfx::Rect(new_origin, bounds.size()))) { |
- SwizzleRGBAToBGRAAndFlip(pixels, bounds.size()); |
- return true; |
- } |
- return false; |
-} |
- |
-void Compositor::WidgetSizeChanged(const gfx::Size& size) { |
- if (size.IsEmpty()) |
- return; |
- size_ = size; |
- host_.setViewportSize(size_); |
- root_web_layer_.setBounds(size_); |
-} |
- |
-void Compositor::AddObserver(CompositorObserver* observer) { |
- observer_list_.AddObserver(observer); |
-} |
- |
-void Compositor::RemoveObserver(CompositorObserver* observer) { |
- observer_list_.RemoveObserver(observer); |
-} |
- |
-bool Compositor::HasObserver(CompositorObserver* observer) { |
- return observer_list_.HasObserver(observer); |
-} |
- |
-void Compositor::OnSwapBuffersPosted() { |
- swap_posted_ = true; |
-} |
- |
-void Compositor::OnSwapBuffersComplete() { |
- DCHECK(swap_posted_); |
- swap_posted_ = false; |
- NotifyEnd(); |
-} |
- |
-void Compositor::OnSwapBuffersAborted() { |
- if (swap_posted_) { |
- swap_posted_ = false; |
- NotifyEnd(); |
- } |
-} |
- |
-void Compositor::updateAnimations(double frameBeginTime) { |
-} |
- |
-void Compositor::layout() { |
- if (root_layer_) |
- root_layer_->SendDamagedRects(); |
-} |
- |
-void Compositor::applyScrollAndScale(const WebKit::WebSize& scrollDelta, |
- float scaleFactor) { |
-} |
- |
-WebKit::WebGraphicsContext3D* Compositor::createContext3D() { |
- if (test_compositor_enabled) { |
- ui::TestWebGraphicsContext3D* test_context = |
- new ui::TestWebGraphicsContext3D(); |
- test_context->Initialize(); |
- return test_context; |
- } else { |
- return ContextFactory::GetInstance()->CreateContext(this); |
- } |
-} |
- |
-void Compositor::didRebindGraphicsContext(bool success) { |
-} |
- |
-void Compositor::didCommitAndDrawFrame() { |
- FOR_EACH_OBSERVER(CompositorObserver, |
- observer_list_, |
- OnCompositingStarted(this)); |
-} |
- |
-void Compositor::didCompleteSwapBuffers() { |
- NotifyEnd(); |
-} |
- |
-void Compositor::scheduleComposite() { |
- ScheduleDraw(); |
-} |
- |
-void Compositor::SwizzleRGBAToBGRAAndFlip(unsigned char* pixels, |
- const gfx::Size& image_size) { |
- // Swizzle from RGBA to BGRA |
- size_t bitmap_size = 4 * image_size.width() * image_size.height(); |
- for(size_t i = 0; i < bitmap_size; i += 4) |
- std::swap(pixels[i], pixels[i + 2]); |
- |
- // Vertical flip to transform from GL co-ords |
- size_t row_size = 4 * image_size.width(); |
- scoped_array<unsigned char> tmp_row(new unsigned char[row_size]); |
- for(int row = 0; row < image_size.height() / 2; row++) { |
- memcpy(tmp_row.get(), |
- &pixels[row * row_size], |
- row_size); |
- memcpy(&pixels[row * row_size], |
- &pixels[bitmap_size - (row + 1) * row_size], |
- row_size); |
- memcpy(&pixels[bitmap_size - (row + 1) * row_size], |
- tmp_row.get(), |
- row_size); |
- } |
-} |
- |
-void Compositor::NotifyEnd() { |
- FOR_EACH_OBSERVER(CompositorObserver, |
- observer_list_, |
- OnCompositingEnded(this)); |
-} |
- |
-COMPOSITOR_EXPORT void SetupTestCompositor() { |
- if (!CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kDisableTestCompositor)) { |
- test_compositor_enabled = true; |
- } |
-} |
- |
-COMPOSITOR_EXPORT void DisableTestCompositor() { |
- test_compositor_enabled = false; |
-} |
- |
-COMPOSITOR_EXPORT bool IsTestCompositorEnabled() { |
- return test_compositor_enabled; |
-} |
- |
-} // namespace ui |