1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/ozone/platform/caca/caca_window_manager.h"
7 #include "base/debug/trace_event.h"
8 #include "third_party/skia/include/core/SkBitmap.h"
9 #include "third_party/skia/include/core/SkCanvas.h"
10 #include "third_party/skia/include/core/SkSurface.h"
11 #include "ui/gfx/skia_util.h"
12 #include "ui/gfx/vsync_provider.h"
13 #include "ui/ozone/platform/caca/caca_window.h"
14 #include "ui/ozone/platform/caca/scoped_caca_types.h"
15 #include "ui/ozone/public/surface_ozone_canvas.h"
21 class CacaSurface : public ui::SurfaceOzoneCanvas {
23 CacaSurface(CacaWindow* window);
24 virtual ~CacaSurface();
28 // ui::SurfaceOzoneCanvas overrides:
29 virtual skia::RefPtr<SkCanvas> GetCanvas() OVERRIDE;
30 virtual void ResizeCanvas(const gfx::Size& viewport_size) OVERRIDE;
31 virtual void PresentCanvas(const gfx::Rect& damage) OVERRIDE;
32 virtual scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider() OVERRIDE;
35 CacaWindow* window_; // Not owned.
37 ScopedCacaDither dither_;
39 skia::RefPtr<SkSurface> surface_;
41 DISALLOW_COPY_AND_ASSIGN(CacaSurface);
44 CacaSurface::CacaSurface(CacaWindow* window) : window_(window) {
47 CacaSurface::~CacaSurface() {
50 bool CacaSurface::Initialize() {
51 ResizeCanvas(window_->bitmap_size());
55 skia::RefPtr<SkCanvas> CacaSurface::GetCanvas() {
56 return skia::SharePtr<SkCanvas>(surface_->getCanvas());
59 void CacaSurface::ResizeCanvas(const gfx::Size& viewport_size) {
60 TRACE_EVENT0("ozone", "CacaSurface::ResizeCanvas");
62 VLOG(2) << "creating libcaca surface with from window " << (void*)window_;
64 SkImageInfo info = SkImageInfo::Make(window_->bitmap_size().width(),
65 window_->bitmap_size().height(),
69 surface_ = skia::AdoptRef(SkSurface::NewRaster(info));
71 LOG(ERROR) << "Failed to create SkSurface";
73 dither_.reset(caca_create_dither(info.bytesPerPixel() * 8,
82 LOG(ERROR) << "failed to create dither";
85 void CacaSurface::PresentCanvas(const gfx::Rect& damage) {
86 TRACE_EVENT0("ozone", "CacaSurface::PresentCanvas");
90 const void* pixels = surface_->peekPixels(&info, &row_bytes);
92 caca_canvas_t* canvas = caca_get_canvas(window_->display());
93 caca_dither_bitmap(canvas,
96 caca_get_canvas_width(canvas),
97 caca_get_canvas_height(canvas),
99 static_cast<const uint8_t*>(pixels));
100 caca_refresh_display(window_->display());
103 scoped_ptr<gfx::VSyncProvider> CacaSurface::CreateVSyncProvider() {
104 return scoped_ptr<gfx::VSyncProvider>();
109 CacaWindowManager::CacaWindowManager() {
112 int32_t CacaWindowManager::AddWindow(CacaWindow* window) {
113 return windows_.Add(window);
116 void CacaWindowManager::RemoveWindow(int window_id, CacaWindow* window) {
117 DCHECK_EQ(window, windows_.Lookup(window_id));
118 windows_.Remove(window_id);
121 CacaWindowManager::~CacaWindowManager() {
124 bool CacaWindowManager::LoadEGLGLES2Bindings(
125 AddGLLibraryCallback add_gl_library,
126 SetGLGetProcAddressProcCallback set_gl_get_proc_address) {
130 scoped_ptr<ui::SurfaceOzoneCanvas> CacaWindowManager::CreateCanvasForWidget(
131 gfx::AcceleratedWidget widget) {
132 CacaWindow* window = windows_.Lookup(widget);
135 scoped_ptr<CacaSurface> canvas(new CacaSurface(window));
136 bool initialized = canvas->Initialize();
138 return canvas.PassAs<ui::SurfaceOzoneCanvas>();