1// Copyright (c) 2012 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. 4 5#include "base/logging.h" 6#include "ui/gl/gl_bindings.h" 7#include "ui/gl/gl_context.h" 8#include "ui/gl/gl_surface_osmesa.h" 9#include "ui/gl/scoped_make_current.h" 10 11namespace gfx { 12 13GLSurfaceOSMesa::GLSurfaceOSMesa(unsigned format, const gfx::Size& size) 14 : format_(format), 15 size_(size) { 16} 17 18bool GLSurfaceOSMesa::Initialize() { 19 return Resize(size_); 20} 21 22void GLSurfaceOSMesa::Destroy() { 23 buffer_.reset(); 24} 25 26bool GLSurfaceOSMesa::Resize(const gfx::Size& new_size) { 27 scoped_ptr<ui::ScopedMakeCurrent> scoped_make_current; 28 GLContext* current_context = GLContext::GetCurrent(); 29 bool was_current = 30 current_context && current_context->IsCurrent(this); 31 if (was_current) { 32 scoped_make_current.reset( 33 new ui::ScopedMakeCurrent(current_context, this)); 34 current_context->ReleaseCurrent(this); 35 } 36 37 // Preserve the old buffer. 38 scoped_ptr<int32[]> old_buffer(buffer_.release()); 39 40 // Allocate a new one. 41 buffer_.reset(new int32[new_size.GetArea()]); 42 memset(buffer_.get(), 0, new_size.GetArea() * sizeof(buffer_[0])); 43 44 // Copy the old back buffer into the new buffer. 45 if (old_buffer.get()) { 46 int copy_width = std::min(size_.width(), new_size.width()); 47 int copy_height = std::min(size_.height(), new_size.height()); 48 for (int y = 0; y < copy_height; ++y) { 49 for (int x = 0; x < copy_width; ++x) { 50 buffer_[y * new_size.width() + x] = old_buffer[y * size_.width() + x]; 51 } 52 } 53 } 54 55 size_ = new_size; 56 57 return true; 58} 59 60bool GLSurfaceOSMesa::IsOffscreen() { 61 return true; 62} 63 64bool GLSurfaceOSMesa::SwapBuffers() { 65 NOTREACHED() << "Should not call SwapBuffers on an GLSurfaceOSMesa."; 66 return false; 67} 68 69gfx::Size GLSurfaceOSMesa::GetSize() { 70 return size_; 71} 72 73void* GLSurfaceOSMesa::GetHandle() { 74 return buffer_.get(); 75} 76 77unsigned GLSurfaceOSMesa::GetFormat() { 78 return format_; 79} 80 81GLSurfaceOSMesa::~GLSurfaceOSMesa() { 82 Destroy(); 83} 84 85} // namespace gfx 86