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