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 11 namespace gfx { 12 13 GLSurfaceOSMesa::GLSurfaceOSMesa(unsigned format, const gfx::Size& size) 14 : format_(format), 15 size_(size) { 16 } 17 18 bool GLSurfaceOSMesa::Initialize() { 19 return Resize(size_); 20 } 21 22 void GLSurfaceOSMesa::Destroy() { 23 buffer_.reset(); 24 } 25 26 bool 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 60 bool GLSurfaceOSMesa::IsOffscreen() { 61 return true; 62 } 63 64 bool GLSurfaceOSMesa::SwapBuffers() { 65 NOTREACHED() << "Should not call SwapBuffers on an GLSurfaceOSMesa."; 66 return false; 67 } 68 69 gfx::Size GLSurfaceOSMesa::GetSize() { 70 return size_; 71 } 72 73 void* GLSurfaceOSMesa::GetHandle() { 74 return buffer_.get(); 75 } 76 77 unsigned GLSurfaceOSMesa::GetFormat() { 78 return format_; 79 } 80 81 GLSurfaceOSMesa::~GLSurfaceOSMesa() { 82 Destroy(); 83 } 84 85 } // namespace gfx 86