Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Unified Diff: plugin/mac/o3d_layer.mm

Issue 577038: O3D Mac: Add CoreAnimation support (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/o3d/
Patch Set: '' Created 10 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « plugin/mac/o3d_layer.h ('k') | plugin/mac/plugin_mac.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: plugin/mac/o3d_layer.mm
===================================================================
--- plugin/mac/o3d_layer.mm (revision 0)
+++ plugin/mac/o3d_layer.mm (revision 0)
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2009, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#import "plugin_mac.h"
+#import <OpenGL/OpenGL.h>
+#import "o3d_layer.h"
+
+#include "display_window_mac.h"
+using o3d::DisplayWindowMac;
+
+@implementation O3DLayer
+
+
+- (id)init {
+ self = [super init];
+
+ // Set ourselves up to composite correctly. Users can write
+ // arbitrary alpha values into the back buffer but O3D's output is
+ // defined as being opaque. For correct rendering results we must
+ // basically drop the alpha channel while drawing to the screen
+ // using Core Animation. Setting the opaque flag achieves this.
+ if (self != nil) {
+ self.opaque = YES;
+ }
+
+ return self;
+}
+
+- (void)setPluginObject:(PluginObject *)obj {
+ obj_ = obj;
+}
+
+
+/* Called when a new frame needs to be generated for layer time 't'.
+ * 'ctx' is attached to the rendering destination. It's state is
+ * otherwise undefined. When non-null 'ts' describes the display
+ * timestamp associated with layer time 't'. The default implementation
+ * of the method flushes the context. */
+
+
+- (void)drawInCGLContext:(CGLContextObj)ctx
+ pixelFormat:(CGLPixelFormatObj)pf
+ forLayerTime:(CFTimeInterval)t
+ displayTime:(const CVTimeStamp *)ts {
+
+ // Set the current context to the one given to us.
+ CGLSetCurrentContext(ctx);
+
+ if (created_context_) {
+ DCHECK_EQ(ctx, obj_->mac_cgl_context_);
+ o3d::DisplayWindowMac default_display;
+ default_display.set_agl_context(obj_->mac_agl_context_);
+ default_display.set_cgl_context(obj_->mac_cgl_context_);
+ obj_->CreateRenderer(default_display);
+ obj_->client()->Init();
+ created_context_ = false;
+ }
+
+ if (was_resized_) {
+ obj_->Resize(width_, height_);
+ was_resized_ = false;
+ }
+
+
+ if (obj_) {
+ obj_->client()->Tick();
+ obj_->client()->RenderClient(true);
+ }
+
+ // Call super to finalize the drawing. By default it just calls glFlush().
+ [super drawInCGLContext:ctx pixelFormat:pf forLayerTime:t displayTime:ts];
+}
+
+- (BOOL)canDrawInCGLContext:(CGLContextObj)ctx
+ pixelFormat:(CGLPixelFormatObj)pf
+ forLayerTime:(CFTimeInterval)t
+ displayTime:(const CVTimeStamp *)ts {
+ return YES;
+}
+
+
+
+
+/* Called by the CAOpenGLLayer implementation when a rendering context
+ * is needed by the layer. Should return an OpenGL context with
+ * renderers from pixel format 'pixelFormat'. The default implementation
+ * allocates a new context with a null share context. */
+- (CGLContextObj)copyCGLContextForPixelFormat:(CGLPixelFormatObj)pixelFormat {
+ glContext_ = [super copyCGLContextForPixelFormat:pixelFormat];
+ obj_->mac_cgl_context_ = glContext_;
+ created_context_ = true;
+
+ return glContext_;
+}
+
+/*
+- (CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask {
+ return [super copyCGLPixelFormatForDisplayMask:mask];
+}*/
+
+
+#define PFA(number) static_cast<CGLPixelFormatAttribute>(number)
+
+#define O3D_COLOR_AND_DEPTH_SETTINGS kCGLPFAClosestPolicy, \
+ kCGLPFAColorSize, PFA(24), \
+ kCGLPFAAlphaSize, PFA(8), \
+ kCGLPFADepthSize, PFA(24), \
+ kCGLPFADoubleBuffer,
+#define O3D_STENCIL_SETTINGS kCGLPFAStencilSize, PFA(8),
+#define O3D_HARDWARE_RENDERER kCGLPFAAccelerated, kCGLPFANoRecovery,
+#define O3D_MULTISAMPLE kCGLPFAMultisample, kCGLPFASamples, PFA(4),
+#define O3D_DISPLAY_MASK(mask) kCGLPFADisplayMask, PFA(mask),
+#define O3D_END PFA(0)
+- (CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask {
+ const CGLPixelFormatAttribute attributes[] = {
+ O3D_COLOR_AND_DEPTH_SETTINGS
+ O3D_STENCIL_SETTINGS
+ O3D_HARDWARE_RENDERER
+ O3D_DISPLAY_MASK(mask)
+ O3D_MULTISAMPLE
+ O3D_END
+ };
+ CGLPixelFormatObj pixel_format = NULL;
+ GLint num_screens = 0;
+ if (!CGLChoosePixelFormat(attributes, &pixel_format, &num_screens) &&
+ pixel_format) {
+ return pixel_format;
+ } else {
+ // Try a less capable set.
+ static const CGLPixelFormatAttribute low_end_attributes[] = {
+ O3D_COLOR_AND_DEPTH_SETTINGS
+ O3D_STENCIL_SETTINGS
+ O3D_HARDWARE_RENDERER
+ O3D_DISPLAY_MASK(mask)
+ O3D_END
+ };
+ if (!CGLChoosePixelFormat(low_end_attributes,
+ &pixel_format, &num_screens) && pixel_format) {
+ return pixel_format;
+ } else {
+ // Do whatever the superclass supports.
+ return [super copyCGLPixelFormatForDisplayMask:mask];
+ }
+ }
+}
+
+
+- (CGLContextObj)glContext {
+ return glContext_;
+}
+
+- (void)setWidth:(int)width height:(int)height {
+ width_ = width;
+ height_ = height;
+ was_resized_ = true;
+}
+
+@end
Property changes on: plugin/mac/o3d_layer.mm
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « plugin/mac/o3d_layer.h ('k') | plugin/mac/plugin_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698