[BlackBerry] requestAnimationFrame: Unscheduled display link frames need to be sent...
[WebKit-https.git] / Source / WebCore / platform / graphics / blackberry / DisplayRefreshMonitorBlackBerry.cpp
1 /*
2  * Copyright (C) 2010, 2011 Research In Motion Limited. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include "config.h"
20
21 #if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
22
23 #include "DisplayRefreshMonitor.h"
24
25 #include <wtf/CurrentTime.h>
26 #include <wtf/MainThread.h>
27
28 namespace WebCore {
29
30 DisplayAnimationClient::DisplayAnimationClient(DisplayRefreshMonitor *monitor)
31     : m_monitor(monitor)
32 {
33 }
34
35 void DisplayAnimationClient::animationFrameChanged()
36 {
37     m_monitor->displayLinkFired();
38 }
39
40 DisplayRefreshMonitor::~DisplayRefreshMonitor()
41 {
42     stopAnimationClient();
43     cancelCallOnMainThread(DisplayRefreshMonitor::handleDisplayRefreshedNotificationOnMainThread, this);
44 }
45
46 void DisplayRefreshMonitor::startAnimationClient()
47 {
48     if (m_animationClient)
49         return;
50
51     m_animationClient = new DisplayAnimationClient(this);
52     BlackBerry::Platform::AnimationFrameRateController::instance()->addClient(m_animationClient);
53 }
54
55 void DisplayRefreshMonitor::stopAnimationClient()
56 {
57     if (!m_animationClient)
58         return;
59
60     BlackBerry::Platform::AnimationFrameRateController::instance()->removeClient(m_animationClient);
61     delete m_animationClient;
62     m_animationClient = 0;
63 }
64
65 bool DisplayRefreshMonitor::requestRefreshCallback()
66 {
67     MutexLocker lock(m_mutex);
68
69     startAnimationClient();
70
71     m_scheduled = true;
72     return true;
73 }
74
75 void DisplayRefreshMonitor::displayLinkFired()
76 {
77     if (!m_mutex.tryLock())
78         return;
79
80     if (!m_previousFrameDone) {
81         m_mutex.unlock();
82         return;
83     }
84
85     m_previousFrameDone = false;
86
87     m_timestamp = currentTime();
88
89     callOnMainThread(handleDisplayRefreshedNotificationOnMainThread, this);
90     m_mutex.unlock();
91 }
92
93 }
94
95 #endif // USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)