| // 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/platform/caca/caca_window_manager.h" |
| |
| #include "base/debug/trace_event.h" |
| #include "third_party/skia/include/core/SkBitmap.h" |
| #include "third_party/skia/include/core/SkCanvas.h" |
| #include "third_party/skia/include/core/SkSurface.h" |
| #include "ui/gfx/skia_util.h" |
| #include "ui/gfx/vsync_provider.h" |
| #include "ui/ozone/platform/caca/caca_window.h" |
| #include "ui/ozone/platform/caca/scoped_caca_types.h" |
| #include "ui/ozone/public/surface_ozone_canvas.h" |
| |
| namespace ui { |
| |
| namespace { |
| |
| class CacaSurface : public ui::SurfaceOzoneCanvas { |
| public: |
| CacaSurface(CacaWindow* window); |
| virtual ~CacaSurface(); |
| |
| bool Initialize(); |
| |
| // ui::SurfaceOzoneCanvas overrides: |
| virtual skia::RefPtr<SkCanvas> GetCanvas() override; |
| virtual void ResizeCanvas(const gfx::Size& viewport_size) override; |
| virtual void PresentCanvas(const gfx::Rect& damage) override; |
| virtual scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider() override; |
| |
| private: |
| CacaWindow* window_; // Not owned. |
| |
| ScopedCacaDither dither_; |
| |
| skia::RefPtr<SkSurface> surface_; |
| |
| DISALLOW_COPY_AND_ASSIGN(CacaSurface); |
| }; |
| |
| CacaSurface::CacaSurface(CacaWindow* window) : window_(window) { |
| } |
| |
| CacaSurface::~CacaSurface() { |
| } |
| |
| bool CacaSurface::Initialize() { |
| ResizeCanvas(window_->bitmap_size()); |
| return true; |
| } |
| |
| skia::RefPtr<SkCanvas> CacaSurface::GetCanvas() { |
| return skia::SharePtr<SkCanvas>(surface_->getCanvas()); |
| } |
| |
| void CacaSurface::ResizeCanvas(const gfx::Size& viewport_size) { |
| TRACE_EVENT0("ozone", "CacaSurface::ResizeCanvas"); |
| |
| VLOG(2) << "creating libcaca surface with from window " << (void*)window_; |
| |
| SkImageInfo info = SkImageInfo::Make(window_->bitmap_size().width(), |
| window_->bitmap_size().height(), |
| kN32_SkColorType, |
| kPremul_SkAlphaType); |
| |
| surface_ = skia::AdoptRef(SkSurface::NewRaster(info)); |
| if (!surface_) |
| LOG(ERROR) << "Failed to create SkSurface"; |
| |
| dither_.reset(caca_create_dither(info.bytesPerPixel() * 8, |
| info.width(), |
| info.height(), |
| info.minRowBytes(), |
| 0x00ff0000, |
| 0x0000ff00, |
| 0x000000ff, |
| 0xff000000)); |
| if (!dither_) |
| LOG(ERROR) << "failed to create dither"; |
| } |
| |
| void CacaSurface::PresentCanvas(const gfx::Rect& damage) { |
| TRACE_EVENT0("ozone", "CacaSurface::PresentCanvas"); |
| |
| SkImageInfo info; |
| size_t row_bytes; |
| const void* pixels = surface_->peekPixels(&info, &row_bytes); |
| |
| caca_canvas_t* canvas = caca_get_canvas(window_->display()); |
| caca_dither_bitmap(canvas, |
| 0, |
| 0, |
| caca_get_canvas_width(canvas), |
| caca_get_canvas_height(canvas), |
| dither_.get(), |
| static_cast<const uint8_t*>(pixels)); |
| caca_refresh_display(window_->display()); |
| } |
| |
| scoped_ptr<gfx::VSyncProvider> CacaSurface::CreateVSyncProvider() { |
| return scoped_ptr<gfx::VSyncProvider>(); |
| } |
| |
| } // namespace |
| |
| CacaWindowManager::CacaWindowManager() { |
| } |
| |
| int32_t CacaWindowManager::AddWindow(CacaWindow* window) { |
| return windows_.Add(window); |
| } |
| |
| void CacaWindowManager::RemoveWindow(int window_id, CacaWindow* window) { |
| DCHECK_EQ(window, windows_.Lookup(window_id)); |
| windows_.Remove(window_id); |
| } |
| |
| CacaWindowManager::~CacaWindowManager() { |
| } |
| |
| bool CacaWindowManager::LoadEGLGLES2Bindings( |
| AddGLLibraryCallback add_gl_library, |
| SetGLGetProcAddressProcCallback set_gl_get_proc_address) { |
| return false; |
| } |
| |
| scoped_ptr<ui::SurfaceOzoneCanvas> CacaWindowManager::CreateCanvasForWidget( |
| gfx::AcceleratedWidget widget) { |
| CacaWindow* window = windows_.Lookup(widget); |
| DCHECK(window); |
| |
| scoped_ptr<CacaSurface> canvas(new CacaSurface(window)); |
| bool initialized = canvas->Initialize(); |
| DCHECK(initialized); |
| return canvas.Pass(); |
| } |
| |
| } // namespace ui |