- add sources.
[platform/framework/web/crosswalk.git] / src / ui / gl / gl_surface_osmesa.cc
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