12fc2651226baac27029e38c9d6ef883fa32084dbSteve Block/*
22fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (C) 2011 Apple Inc. All rights reserved.
32fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *
42fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Redistribution and use in source and binary forms, with or without
52fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * modification, are permitted provided that the following conditions
62fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * are met:
72fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 1. Redistributions of source code must retain the above copyright
82fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *    notice, this list of conditions and the following disclaimer.
92fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 2. Redistributions in binary form must reproduce the above copyright
102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *    notice, this list of conditions and the following disclaimer in the
112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *    documentation and/or other materials provided with the distribution.
122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block *
132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * THE POSSIBILITY OF SUCH DAMAGE.
242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block */
252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "config.h"
272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "CoreAnimationRenderer.h"
282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import <WebKitSystemInterface.h>
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import <QuartzCore/QuartzCore.h>
312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import <OpenGL/CGLMacro.h>
322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// The CGLMacro.h header adds an implicit CGLContextObj parameter to all OpenGL calls,
342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// which is good because it allows us to make OpenGL calls without saving and restoring the
352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// current context. The context argument is named "cgl_ctx" by default, so we use the macro
362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// below to declare this variable.
372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#define DECLARE_GL_CONTEXT_VARIABLE(name) \
382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CGLContextObj cgl_ctx = (name)
392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
402fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocknamespace WebKit {
412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
422fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<CoreAnimationRenderer> CoreAnimationRenderer::create(Client* client, CGLContextObj cglContextObj, CALayer *layer)
432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return adoptRef(new CoreAnimationRenderer(client, cglContextObj, layer));
452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
472fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockCoreAnimationRenderer::CoreAnimationRenderer(Client* client, CGLContextObj cglContextObj, CALayer *layer)
482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : m_client(client)
492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_cglContext(cglContextObj)
502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_renderer([CARenderer rendererWithCGLContext:m_cglContext options:nil])
512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [m_renderer.get() setLayer:layer];
532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WKCARendererAddChangeNotificationObserver(m_renderer.get(), rendererDidChange, this);
552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
572fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockCoreAnimationRenderer::~CoreAnimationRenderer()
582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!m_client);
602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
622fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CoreAnimationRenderer::setBounds(CGRect bounds)
632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [m_renderer.get() setBounds:bounds];
652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [CATransaction begin];
672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [CATransaction setDisableActions:YES];
682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [[m_renderer.get() layer] setFrame:bounds];
692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [CATransaction commit];
702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
722fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CoreAnimationRenderer::render(CFTimeInterval frameTime, CVTimeStamp* timeStamp, CFTimeInterval& nextFrameTime)
732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [m_renderer.get() beginFrameAtTime:frameTime timeStamp:timeStamp];
752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [m_renderer.get() render];
762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    nextFrameTime = [m_renderer.get() nextFrameTime];
772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [m_renderer.get() endFrame];
782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
802fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CoreAnimationRenderer::invalidate()
812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_client);
832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WKCARendererRemoveChangeNotificationObserver(m_renderer.get(), rendererDidChange, this);
852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_client = 0;
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
882fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CoreAnimationRenderer::rendererDidChange(void* context)
892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static_cast<CoreAnimationRenderer*>(context)->rendererDidChange();
912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
932fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CoreAnimationRenderer::rendererDidChange()
942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_client);
962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_client->rendererDidChange(this);
982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} // namespace WebKit
101