Home | History | Annotate | Download | only in mac
      1 /*
      2  * Copyright (C) 2011 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
     14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
     17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     23  * THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #import "config.h"
     27 #import "CoreAnimationRenderer.h"
     28 
     29 #import <WebKitSystemInterface.h>
     30 #import <QuartzCore/QuartzCore.h>
     31 #import <OpenGL/CGLMacro.h>
     32 
     33 // The CGLMacro.h header adds an implicit CGLContextObj parameter to all OpenGL calls,
     34 // which is good because it allows us to make OpenGL calls without saving and restoring the
     35 // current context. The context argument is named "cgl_ctx" by default, so we use the macro
     36 // below to declare this variable.
     37 #define DECLARE_GL_CONTEXT_VARIABLE(name) \
     38     CGLContextObj cgl_ctx = (name)
     39 
     40 namespace WebKit {
     41 
     42 PassRefPtr<CoreAnimationRenderer> CoreAnimationRenderer::create(Client* client, CGLContextObj cglContextObj, CALayer *layer)
     43 {
     44     return adoptRef(new CoreAnimationRenderer(client, cglContextObj, layer));
     45 }
     46 
     47 CoreAnimationRenderer::CoreAnimationRenderer(Client* client, CGLContextObj cglContextObj, CALayer *layer)
     48     : m_client(client)
     49     , m_cglContext(cglContextObj)
     50     , m_renderer([CARenderer rendererWithCGLContext:m_cglContext options:nil])
     51 {
     52     [m_renderer.get() setLayer:layer];
     53 
     54     WKCARendererAddChangeNotificationObserver(m_renderer.get(), rendererDidChange, this);
     55 }
     56 
     57 CoreAnimationRenderer::~CoreAnimationRenderer()
     58 {
     59     ASSERT(!m_client);
     60 }
     61 
     62 void CoreAnimationRenderer::setBounds(CGRect bounds)
     63 {
     64     [m_renderer.get() setBounds:bounds];
     65 
     66     [CATransaction begin];
     67     [CATransaction setDisableActions:YES];
     68     [[m_renderer.get() layer] setFrame:bounds];
     69     [CATransaction commit];
     70 }
     71 
     72 void CoreAnimationRenderer::render(CFTimeInterval frameTime, CVTimeStamp* timeStamp, CFTimeInterval& nextFrameTime)
     73 {
     74     [m_renderer.get() beginFrameAtTime:frameTime timeStamp:timeStamp];
     75     [m_renderer.get() render];
     76     nextFrameTime = [m_renderer.get() nextFrameTime];
     77     [m_renderer.get() endFrame];
     78 }
     79 
     80 void CoreAnimationRenderer::invalidate()
     81 {
     82     ASSERT(m_client);
     83 
     84     WKCARendererRemoveChangeNotificationObserver(m_renderer.get(), rendererDidChange, this);
     85     m_client = 0;
     86 }
     87 
     88 void CoreAnimationRenderer::rendererDidChange(void* context)
     89 {
     90     static_cast<CoreAnimationRenderer*>(context)->rendererDidChange();
     91 }
     92 
     93 void CoreAnimationRenderer::rendererDidChange()
     94 {
     95     ASSERT(m_client);
     96 
     97     m_client->rendererDidChange(this);
     98 }
     99 
    100 } // namespace WebKit
    101