Home | History | Annotate | Download | only in gl
      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