|
Lines 88-94
void CCLayerTreeHostImpl::animate(double frameBeginTimeMs)
a/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp_sec1
|
| 88 |
if (!m_pageScaleAnimation) |
88 |
if (!m_pageScaleAnimation) |
| 89 |
return; |
89 |
return; |
| 90 |
|
90 |
|
| 91 |
IntSize scrollTotal = toSize(m_scrollLayerImpl->scrollPosition() + m_scrollLayerImpl->scrollDelta()); |
91 |
IntSize scrollTotal = toSize(m_scrollLayerImpl->scrollPosition() + flooredIntPoint(m_scrollLayerImpl->scrollDelta())); |
| 92 |
|
92 |
|
| 93 |
setPageScaleDelta(m_pageScaleAnimation->pageScaleAtTime(frameBeginTimeMs) / m_pageScale); |
93 |
setPageScaleDelta(m_pageScaleAnimation->pageScaleAtTime(frameBeginTimeMs) / m_pageScale); |
| 94 |
IntSize nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(frameBeginTimeMs); |
94 |
IntSize nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(frameBeginTimeMs); |
|
Lines 107-113
void CCLayerTreeHostImpl::startPageScaleAnimation(const IntSize& targetPosition,
a/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp_sec2
|
| 107 |
if (!m_scrollLayerImpl) |
107 |
if (!m_scrollLayerImpl) |
| 108 |
return; |
108 |
return; |
| 109 |
|
109 |
|
| 110 |
IntSize scrollTotal = toSize(m_scrollLayerImpl->scrollPosition() + m_scrollLayerImpl->scrollDelta()); |
110 |
IntSize scrollTotal = toSize(m_scrollLayerImpl->scrollPosition() + flooredIntPoint(m_scrollLayerImpl->scrollDelta())); |
| 111 |
scrollTotal.scale(m_pageScaleDelta); |
111 |
scrollTotal.scale(m_pageScaleDelta); |
| 112 |
float scaleTotal = m_pageScale * m_pageScaleDelta; |
112 |
float scaleTotal = m_pageScale * m_pageScaleDelta; |
| 113 |
IntSize scaledContentSize = m_scrollLayerImpl->children()[0]->contentBounds(); |
113 |
IntSize scaledContentSize = m_scrollLayerImpl->children()[0]->contentBounds(); |
|
Lines 194-201
static CCLayerImpl* findScrollLayer(CCLayerImpl* layer)
a/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp_sec3
|
| 194 |
void CCLayerTreeHostImpl::setRootLayer(PassRefPtr<CCLayerImpl> layer) |
194 |
void CCLayerTreeHostImpl::setRootLayer(PassRefPtr<CCLayerImpl> layer) |
| 195 |
{ |
195 |
{ |
| 196 |
m_rootLayerImpl = layer; |
196 |
m_rootLayerImpl = layer; |
| 197 |
|
|
|
| 198 |
// FIXME: Currently, this only finds the first scrollable layer. |
| 199 |
m_scrollLayerImpl = findScrollLayer(m_rootLayerImpl.get()); |
197 |
m_scrollLayerImpl = findScrollLayer(m_rootLayerImpl.get()); |
| 200 |
} |
198 |
} |
| 201 |
|
199 |
|
|
Lines 263-277
void CCLayerTreeHostImpl::setPageScaleFactorAndLimits(float pageScale, float min
a/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp_sec4
|
| 263 |
|
261 |
|
| 264 |
void CCLayerTreeHostImpl::adjustScrollsForPageScaleChange(float pageScaleChange) |
262 |
void CCLayerTreeHostImpl::adjustScrollsForPageScaleChange(float pageScaleChange) |
| 265 |
{ |
263 |
{ |
| 266 |
if (pageScaleChange == 1) |
264 |
if (!m_scrollLayerImpl || pageScaleChange == 1) |
| 267 |
return; |
265 |
return; |
| 268 |
|
266 |
|
| 269 |
// We also need to convert impl-side scroll deltas to pageScale space. |
267 |
// We also need to convert impl-side scroll delta for the root layer to pageScale space. |
| 270 |
if (m_scrollLayerImpl) { |
268 |
FloatSize scrollDelta = m_scrollLayerImpl->scrollDelta(); |
| 271 |
IntSize scrollDelta = m_scrollLayerImpl->scrollDelta(); |
269 |
scrollDelta.scale(pageScaleChange); |
| 272 |
scrollDelta.scale(pageScaleChange); |
270 |
m_scrollLayerImpl->setScrollDelta(scrollDelta); |
| 273 |
m_scrollLayerImpl->setScrollDelta(scrollDelta); |
|
|
| 274 |
} |
| 275 |
} |
271 |
} |
| 276 |
|
272 |
|
| 277 |
void CCLayerTreeHostImpl::setPageScaleDelta(float delta) |
273 |
void CCLayerTreeHostImpl::setPageScaleDelta(float delta) |
|
Lines 313-321
void CCLayerTreeHostImpl::updateMaxScrollPosition()
a/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp_sec5
|
| 313 |
// having a vertical scrollbar but no horizontal overflow. |
309 |
// having a vertical scrollbar but no horizontal overflow. |
| 314 |
maxScroll.clampNegativeToZero(); |
310 |
maxScroll.clampNegativeToZero(); |
| 315 |
|
311 |
|
|
|
312 |
// We only need to update the root layer scroll range, since the child |
| 313 |
// layers use unscaled scroll coordinates. |
| 316 |
m_scrollLayerImpl->setMaxScrollPosition(maxScroll); |
314 |
m_scrollLayerImpl->setMaxScrollPosition(maxScroll); |
| 317 |
|
|
|
| 318 |
// TODO(aelias): Also update sublayers. |
| 319 |
} |
315 |
} |
| 320 |
|
316 |
|
| 321 |
void CCLayerTreeHostImpl::setZoomAnimatorTransform(const TransformationMatrix& zoom) |
317 |
void CCLayerTreeHostImpl::setZoomAnimatorTransform(const TransformationMatrix& zoom) |
|
Lines 336-363
void CCLayerTreeHostImpl::setNeedsRedraw()
a/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp_sec6
|
| 336 |
m_client->setNeedsRedrawOnImplThread(); |
332 |
m_client->setNeedsRedrawOnImplThread(); |
| 337 |
} |
333 |
} |
| 338 |
|
334 |
|
| 339 |
CCInputHandlerClient::ScrollStatus CCLayerTreeHostImpl::scrollBegin(const IntPoint&) |
335 |
CCInputHandlerClient::ScrollStatus CCLayerTreeHostImpl::beginScrollingInnermostLayerAtPoint(CCLayerImpl* layerImpl, const IntPoint& viewportPoint) |
|
|
336 |
{ |
| 337 |
if (!layerImpl) |
| 338 |
return CCInputHandlerClient::ScrollIgnored; |
| 339 |
|
| 340 |
for (size_t i = 0; i < layerImpl->children().size(); i++) { |
| 341 |
CCInputHandlerClient::ScrollStatus status = beginScrollingInnermostLayerAtPoint(layerImpl->children()[i].get(), viewportPoint); |
| 342 |
if (status == CCInputHandlerClient::ScrollStarted || status == CCInputHandlerClient::ScrollFailed) |
| 343 |
return status; |
| 344 |
} |
| 345 |
|
| 346 |
IntPoint contentPoint(layerImpl->screenSpaceTransform().inverse().mapPoint(viewportPoint)); |
| 347 |
|
| 348 |
// The content point for non-root layers must be scaled with the page scale. Note that the |
| 349 |
// page scale delta is already embedded in each layer's screen space transform. |
| 350 |
if (layerImpl != m_scrollLayerImpl) |
| 351 |
contentPoint.scale(m_pageScale, m_pageScale); |
| 352 |
|
| 353 |
if (layerImpl->drawsContent() && !layerImpl->visibleLayerRect().contains(contentPoint)) |
| 354 |
return CCInputHandlerClient::ScrollIgnored; |
| 355 |
|
| 356 |
if (layerImpl->scrollable()) { |
| 357 |
m_currentlyScrollingLayerImpl = layerImpl; |
| 358 |
return CCInputHandlerClient::ScrollStarted; |
| 359 |
} |
| 360 |
|
| 361 |
return CCInputHandlerClient::ScrollIgnored; |
| 362 |
} |
| 363 |
|
| 364 |
CCInputHandlerClient::ScrollStatus CCLayerTreeHostImpl::scrollBegin(const IntPoint& viewportPoint) |
| 340 |
{ |
365 |
{ |
| 341 |
// TODO: Check for scrollable sublayers. |
366 |
return beginScrollingInnermostLayerAtPoint(m_scrollLayerImpl.get(), viewportPoint); |
| 342 |
if (!m_scrollLayerImpl || !m_scrollLayerImpl->scrollable()) |
367 |
} |
| 343 |
return ScrollIgnored; |
|
|
| 344 |
|
368 |
|
| 345 |
return ScrollStarted; |
369 |
static bool layerCanBeScrolled(const CCLayerImpl* layerImpl, const IntSize& direction) |
|
|
370 |
{ |
| 371 |
IntPoint scrollPosition(layerImpl->scrollPosition() + flooredIntPoint(layerImpl->scrollDelta())); |
| 372 |
if (!layerImpl->scrollable()) |
| 373 |
return false; |
| 374 |
if (direction.width() < 0 && scrollPosition.x() > 0) |
| 375 |
return true; |
| 376 |
if (direction.height() < 0 && scrollPosition.y() > 0) |
| 377 |
return true; |
| 378 |
if (direction.width() > 0 && scrollPosition.x() < layerImpl->maxScrollPosition().width()) |
| 379 |
return true; |
| 380 |
if (direction.height() > 0 && scrollPosition.y() < layerImpl->maxScrollPosition().height()) |
| 381 |
return true; |
| 382 |
return false; |
| 346 |
} |
383 |
} |
| 347 |
|
384 |
|
| 348 |
void CCLayerTreeHostImpl::scrollBy(const IntSize& scrollDelta) |
385 |
void CCLayerTreeHostImpl::scrollBy(const IntSize& scrollDelta) |
| 349 |
{ |
386 |
{ |
| 350 |
TRACE_EVENT("CCLayerTreeHostImpl::scrollBy", this, 0); |
387 |
TRACE_EVENT("CCLayerTreeHostImpl::scrollBy", this, 0); |
| 351 |
if (!m_scrollLayerImpl) |
388 |
if (!m_currentlyScrollingLayerImpl) |
| 352 |
return; |
389 |
return; |
| 353 |
|
390 |
|
| 354 |
m_scrollLayerImpl->scrollBy(scrollDelta); |
391 |
IntSize pendingDelta(scrollDelta); |
| 355 |
m_client->setNeedsCommitOnImplThread(); |
392 |
CCLayerImpl* layerImpl = m_currentlyScrollingLayerImpl.get(); |
| 356 |
m_client->setNeedsRedrawOnImplThread(); |
393 |
while (layerImpl) { |
|
|
394 |
if (layerCanBeScrolled(layerImpl, pendingDelta)) { |
| 395 |
FloatSize previousDelta(layerImpl->scrollDelta()); |
| 396 |
FloatSize scaledPendingDelta(pendingDelta); |
| 397 |
// Since scrollDelta is in window coordinates, it already has the page scale applied. |
| 398 |
// This matches what the root scroll layer expects, but child layers are scrolled using |
| 399 |
// unscaled content coordinates instead, so we have to undo the scaling for them. The |
| 400 |
// page scale delta needs to be unapplied with both layer types since the scroll |
| 401 |
// coordinates do not respect it. |
| 402 |
if (layerImpl == m_scrollLayerImpl) { |
| 403 |
scaledPendingDelta.scale(1 / m_pageScaleDelta); |
| 404 |
layerImpl->scrollBy(scaledPendingDelta); |
| 405 |
} else { |
| 406 |
scaledPendingDelta.scale(1 / (m_pageScale * m_pageScaleDelta)); |
| 407 |
layerImpl->scrollBy(scaledPendingDelta); |
| 408 |
} |
| 409 |
// Reset the pending scroll delta to zero if the layer was able to move along the requested |
| 410 |
// axis. This is to ensure it is possible to scroll exactly to the beginning or end of a |
| 411 |
// scroll area regardless of the scroll step. |
| 412 |
if (previousDelta.width() != layerImpl->scrollDelta().width()) |
| 413 |
pendingDelta.setWidth(0); |
| 414 |
if (previousDelta.height() != layerImpl->scrollDelta().height()) |
| 415 |
pendingDelta.setHeight(0); |
| 416 |
// Also reset the delta if the layer did not move because the scroll delta got rounded down |
| 417 |
// to zero and the layer still has room to scroll in the requested direction. This avoids |
| 418 |
// scrolling the parent layer for slow scrolls that do not move the layer at every iteration. |
| 419 |
if (pendingDelta.width() && layerCanBeScrolled(layerImpl, IntSize(pendingDelta.width(), 0))) |
| 420 |
pendingDelta.setWidth(0); |
| 421 |
if (pendingDelta.height() && layerCanBeScrolled(layerImpl, IntSize(0, pendingDelta.height()))) |
| 422 |
pendingDelta.setHeight(0); |
| 423 |
} |
| 424 |
layerImpl = layerImpl->parent(); |
| 425 |
} |
| 426 |
|
| 427 |
if (pendingDelta != scrollDelta) { |
| 428 |
m_client->setNeedsCommitOnImplThread(); |
| 429 |
m_client->setNeedsRedrawOnImplThread(); |
| 430 |
} |
| 357 |
} |
431 |
} |
| 358 |
|
432 |
|
| 359 |
void CCLayerTreeHostImpl::scrollEnd() |
433 |
void CCLayerTreeHostImpl::scrollEnd() |
| 360 |
{ |
434 |
{ |
|
|
435 |
m_currentlyScrollingLayerImpl.clear(); |
| 361 |
} |
436 |
} |
| 362 |
|
437 |
|
| 363 |
bool CCLayerTreeHostImpl::haveWheelEventHandlers() |
438 |
bool CCLayerTreeHostImpl::haveWheelEventHandlers() |
|
Lines 400-409
void CCLayerTreeHostImpl::pinchGestureEnd()
a/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp_sec7
|
| 400 |
m_client->setNeedsCommitOnImplThread(); |
475 |
m_client->setNeedsCommitOnImplThread(); |
| 401 |
} |
476 |
} |
| 402 |
|
477 |
|
|
|
478 |
bool CCLayerTreeHostImpl::collectScrollDeltas(CCScrollAndScaleSet* scrollInfo, CCLayerImpl* layerImpl) const |
| 479 |
{ |
| 480 |
if (!layerImpl->scrollDelta().isZero()) { |
| 481 |
IntSize scrollDelta = toSize(flooredIntPoint(layerImpl->scrollDelta())); |
| 482 |
if (layerImpl != m_scrollLayerImpl) { |
| 483 |
CCLayerTreeHostCommon::ScrollUpdateInfo scroll; |
| 484 |
scroll.layerId = layerImpl->id(); |
| 485 |
scroll.scrollDelta = scrollDelta; |
| 486 |
scrollInfo->scrolls.append(scroll); |
| 487 |
} else |
| 488 |
scrollInfo->rootScrollDelta = scrollDelta; |
| 489 |
layerImpl->setSentScrollDelta(layerImpl->scrollDelta()); |
| 490 |
} |
| 491 |
|
| 492 |
for (size_t i = 0; i < layerImpl->children().size(); ++i) |
| 493 |
collectScrollDeltas(scrollInfo, layerImpl->children()[i].get()); |
| 494 |
|
| 495 |
return !scrollInfo->rootScrollDelta.isZero() || scrollInfo->scrolls.size() > 0; |
| 496 |
} |
| 497 |
|
| 403 |
PassOwnPtr<CCScrollAndScaleSet> CCLayerTreeHostImpl::processScrollDeltas() |
498 |
PassOwnPtr<CCScrollAndScaleSet> CCLayerTreeHostImpl::processScrollDeltas() |
| 404 |
{ |
499 |
{ |
| 405 |
OwnPtr<CCScrollAndScaleSet> scrollInfo = adoptPtr(new CCScrollAndScaleSet()); |
500 |
OwnPtr<CCScrollAndScaleSet> scrollInfo = adoptPtr(new CCScrollAndScaleSet()); |
| 406 |
bool didMove = m_scrollLayerImpl && (!m_scrollLayerImpl->scrollDelta().isZero() || m_pageScaleDelta != 1.0f); |
501 |
bool didMove = m_scrollLayerImpl && (collectScrollDeltas(scrollInfo.get(), m_scrollLayerImpl.get()) || m_pageScaleDelta != 1.0f); |
| 407 |
if (!didMove || m_pinchGestureActive || m_pageScaleAnimation) { |
502 |
if (!didMove || m_pinchGestureActive || m_pageScaleAnimation) { |
| 408 |
m_sentPageScaleDelta = scrollInfo->pageScaleDelta = 1; |
503 |
m_sentPageScaleDelta = scrollInfo->pageScaleDelta = 1; |
| 409 |
return scrollInfo.release(); |
504 |
return scrollInfo.release(); |
|
Lines 411-424
PassOwnPtr<CCScrollAndScaleSet> CCLayerTreeHostImpl::processScrollDeltas()
a/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp_sec8
|
| 411 |
|
506 |
|
| 412 |
m_sentPageScaleDelta = scrollInfo->pageScaleDelta = m_pageScaleDelta; |
507 |
m_sentPageScaleDelta = scrollInfo->pageScaleDelta = m_pageScaleDelta; |
| 413 |
|
508 |
|
| 414 |
// FIXME: track scrolls from layers other than the root |
|
|
| 415 |
CCLayerTreeHostCommon::ScrollUpdateInfo scroll; |
| 416 |
scroll.layerId = m_scrollLayerImpl->id(); |
| 417 |
scroll.scrollDelta = m_scrollLayerImpl->scrollDelta(); |
| 418 |
scrollInfo->scrolls.append(scroll); |
| 419 |
|
| 420 |
m_scrollLayerImpl->setSentScrollDelta(scroll.scrollDelta); |
| 421 |
|
| 422 |
return scrollInfo.release(); |
509 |
return scrollInfo.release(); |
| 423 |
} |
510 |
} |
| 424 |
|
511 |
|