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