Index: ui/gl/gl_image_io_surface.mm |
diff --git a/ui/gl/gl_image_io_surface.cc b/ui/gl/gl_image_io_surface.mm |
similarity index 82% |
rename from ui/gl/gl_image_io_surface.cc |
rename to ui/gl/gl_image_io_surface.mm |
index adcadee363ab5499ca14bd43fbf5bff11378ba51..b1f95f47beb229fa9e3cf15b0edfefaac5cbf86c 100644 |
--- a/ui/gl/gl_image_io_surface.cc |
+++ b/ui/gl/gl_image_io_surface.mm |
@@ -4,15 +4,23 @@ |
#include "ui/gl/gl_image_io_surface.h" |
+#include <map> |
+ |
+#include "base/lazy_instance.h" |
+#include "base/mac/foundation_util.h" |
#include "ui/gl/gl_bindings.h" |
#include "ui/gl/gl_context.h" |
// Note that this must be included after gl_bindings.h to avoid conflicts. |
#include <OpenGL/CGLIOSurface.h> |
+#include <Quartz/Quartz.h> |
namespace gfx { |
namespace { |
+typedef std::map<gfx::AcceleratedWidget,CALayer*> WidgetToLayerMap; |
+base::LazyInstance<WidgetToLayerMap> g_widget_to_layer_map; |
+ |
bool ValidInternalFormat(unsigned internalformat) { |
switch (internalformat) { |
case GL_R8: |
@@ -192,7 +200,31 @@ bool GLImageIOSurface::ScheduleOverlayPlane(gfx::AcceleratedWidget widget, |
OverlayTransform transform, |
const Rect& bounds_rect, |
const RectF& crop_rect) { |
- return false; |
+ // Only simple overlay planes are currently supported. |
+ DCHECK_EQ(0, z_order); |
+ DCHECK_EQ(gfx::RectF(0, 0, 1, 1).ToString(), crop_rect.ToString()); |
+ DCHECK_EQ(gfx::OVERLAY_TRANSFORM_NONE, transform); |
+ |
+ // Convert the phony widget to the appropriate CALayer. |
+ auto found = g_widget_to_layer_map.Pointer()->find(widget); |
+ if (found == g_widget_to_layer_map.Pointer()->end()) |
+ return false; |
+ CALayer* layer = found->second; |
+ |
+ // Also note that transactions are not disabled. The caller must ensure that |
+ // all changes to the CALayer tree happen atomically. |
+ [layer setContents:static_cast<id>(io_surface_.get())]; |
+ [layer setFrame:bounds_rect.ToCGRect()]; |
+ return true; |
+} |
+ |
+// static |
+void GLImageIOSurface::SetLayerForWidget( |
+ gfx::AcceleratedWidget widget, CALayer* layer) { |
+ if (layer) |
+ g_widget_to_layer_map.Pointer()->insert(std::make_pair(widget, layer)); |
+ else |
+ g_widget_to_layer_map.Pointer()->erase(widget); |
} |
} // namespace gfx |