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