Index: ui/ozone/demo/software_renderer.cc |
diff --git a/ui/ozone/demo/software_renderer.cc b/ui/ozone/demo/software_renderer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..162d5e0e4b43c5e101d332085bbcdd40c1592dfa |
--- /dev/null |
+++ b/ui/ozone/demo/software_renderer.cc |
@@ -0,0 +1,72 @@ |
+// Copyright 2014 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/ozone/demo/software_renderer.h" |
+ |
+#include "third_party/skia/include/core/SkCanvas.h" |
+#include "third_party/skia/include/core/SkSurface.h" |
+#include "ui/gfx/vsync_provider.h" |
+#include "ui/ozone/public/ozone_platform.h" |
+#include "ui/ozone/public/surface_factory_ozone.h" |
+#include "ui/ozone/public/surface_ozone_canvas.h" |
+ |
+namespace ui { |
+namespace { |
+ |
+const int kFrameDelayMilliseconds = 16; |
+ |
+} // namespace |
+ |
+SoftwareRenderer::SoftwareRenderer(gfx::AcceleratedWidget widget, |
+ const gfx::Size& size) |
+ : RendererBase(widget, size), |
+ vsync_period_(base::TimeDelta::FromMilliseconds(kFrameDelayMilliseconds)), |
+ weak_ptr_factory_(this) { |
+} |
+ |
+SoftwareRenderer::~SoftwareRenderer() { |
+} |
+ |
+bool SoftwareRenderer::Initialize() { |
+ software_surface_ = ui::OzonePlatform::GetInstance() |
+ ->GetSurfaceFactoryOzone() |
+ ->CreateCanvasForWidget(widget_); |
+ if (!software_surface_) { |
+ LOG(ERROR) << "Failed to create software surface"; |
+ return false; |
+ } |
+ |
+ software_surface_->ResizeCanvas(size_); |
+ vsync_provider_ = software_surface_->CreateVSyncProvider(); |
+ RenderFrame(); |
+ return true; |
+} |
+ |
+void SoftwareRenderer::RenderFrame() { |
+ float fraction = NextFraction(); |
+ |
+ skia::RefPtr<SkSurface> surface = software_surface_->GetSurface(); |
+ |
+ SkColor color = |
+ SkColorSetARGB(0xff, 0, 0xff * fraction, 0xff * (1 - fraction)); |
+ |
+ surface->getCanvas()->clear(color); |
+ |
+ software_surface_->PresentCanvas(gfx::Rect(size_)); |
+ |
+ if (vsync_provider_) { |
+ vsync_provider_->GetVSyncParameters( |
+ base::Bind(&SoftwareRenderer::UpdateVSyncParameters, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ } |
+ |
+ timer_.Start(FROM_HERE, vsync_period_, this, &SoftwareRenderer::RenderFrame); |
+} |
+ |
+void SoftwareRenderer::UpdateVSyncParameters(const base::TimeTicks timebase, |
+ const base::TimeDelta interval) { |
+ vsync_period_ = interval; |
+} |
+ |
+} // namespace ui |