OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 m_paintController->imagePainted()); | 340 m_paintController->imagePainted()); |
341 } | 341 } |
342 | 342 |
343 void GraphicsLayer::updateChildList() { | 343 void GraphicsLayer::updateChildList() { |
344 WebLayer* childHost = m_layer->layer(); | 344 WebLayer* childHost = m_layer->layer(); |
345 childHost->removeAllChildren(); | 345 childHost->removeAllChildren(); |
346 | 346 |
347 clearContentsLayerIfUnregistered(); | 347 clearContentsLayerIfUnregistered(); |
348 | 348 |
349 if (m_contentsLayer) { | 349 if (m_contentsLayer) { |
350 // FIXME: add the contents layer in the correct order with negative z-order
children. | 350 // FIXME: Add the contents layer in the correct order with negative z-order |
351 // This does not cause visible rendering issues because currently contents l
ayers are only used | 351 // children. This does not currently cause visible rendering issues because |
352 // for replaced elements that don't have children. | 352 // contents layers are only used for replaced elements that don't have |
| 353 // children. |
353 childHost->addChild(m_contentsLayer); | 354 childHost->addChild(m_contentsLayer); |
354 } | 355 } |
355 | 356 |
356 for (size_t i = 0; i < m_children.size(); ++i) | 357 for (size_t i = 0; i < m_children.size(); ++i) |
357 childHost->addChild(m_children[i]->platformLayer()); | 358 childHost->addChild(m_children[i]->platformLayer()); |
358 | 359 |
359 for (size_t i = 0; i < m_linkHighlights.size(); ++i) | 360 for (size_t i = 0; i < m_linkHighlights.size(); ++i) |
360 childHost->addChild(m_linkHighlights[i]->layer()); | 361 childHost->addChild(m_linkHighlights[i]->layer()); |
361 } | 362 } |
362 | 363 |
363 void GraphicsLayer::updateLayerIsDrawable() { | 364 void GraphicsLayer::updateLayerIsDrawable() { |
364 // For the rest of the accelerated compositor code, there is no reason to make
a | 365 // For the rest of the accelerated compositor code, there is no reason to make |
365 // distinction between drawsContent and contentsVisible. So, for m_layer->laye
r(), these two | 366 // a distinction between drawsContent and contentsVisible. So, for |
366 // flags are combined here. m_contentsLayer shouldn't receive the drawsContent
flag | 367 // m_layer->layer(), these two flags are combined here. |m_contentsLayer| |
367 // so it is only given contentsVisible. | 368 // shouldn't receive the drawsContent flag, so it is only given |
| 369 // contentsVisible. |
368 | 370 |
369 m_layer->layer()->setDrawsContent(m_drawsContent && m_contentsVisible); | 371 m_layer->layer()->setDrawsContent(m_drawsContent && m_contentsVisible); |
370 if (WebLayer* contentsLayer = contentsLayerIfRegistered()) | 372 if (WebLayer* contentsLayer = contentsLayerIfRegistered()) |
371 contentsLayer->setDrawsContent(m_contentsVisible); | 373 contentsLayer->setDrawsContent(m_contentsVisible); |
372 | 374 |
373 if (m_drawsContent) { | 375 if (m_drawsContent) { |
374 m_layer->layer()->invalidate(); | 376 m_layer->layer()->invalidate(); |
375 for (size_t i = 0; i < m_linkHighlights.size(); ++i) | 377 for (size_t i = 0; i < m_linkHighlights.size(); ++i) |
376 m_linkHighlights[i]->invalidate(); | 378 m_linkHighlights[i]->invalidate(); |
377 } | 379 } |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 | 445 |
444 void GraphicsLayer::setupContentsLayer(WebLayer* contentsLayer) { | 446 void GraphicsLayer::setupContentsLayer(WebLayer* contentsLayer) { |
445 ASSERT(contentsLayer); | 447 ASSERT(contentsLayer); |
446 m_contentsLayer = contentsLayer; | 448 m_contentsLayer = contentsLayer; |
447 m_contentsLayerId = m_contentsLayer->id(); | 449 m_contentsLayerId = m_contentsLayer->id(); |
448 | 450 |
449 m_contentsLayer->setLayerClient(this); | 451 m_contentsLayer->setLayerClient(this); |
450 m_contentsLayer->setTransformOrigin(FloatPoint3D()); | 452 m_contentsLayer->setTransformOrigin(FloatPoint3D()); |
451 m_contentsLayer->setUseParentBackfaceVisibility(true); | 453 m_contentsLayer->setUseParentBackfaceVisibility(true); |
452 | 454 |
453 // It is necessary to call setDrawsContent as soon as we receive the new conte
ntsLayer, for | 455 // It is necessary to call setDrawsContent as soon as we receive the new |
454 // the correctness of early exit conditions in setDrawsContent() and setConten
tsVisible(). | 456 // contentsLayer, for the correctness of early exit conditions in |
| 457 // setDrawsContent() and setContentsVisible(). |
455 m_contentsLayer->setDrawsContent(m_contentsVisible); | 458 m_contentsLayer->setDrawsContent(m_contentsVisible); |
456 | 459 |
457 // Insert the content layer first. Video elements require this, because they h
ave | 460 // Insert the content layer first. Video elements require this, because they |
458 // shadow content that must display in front of the video. | 461 // have shadow content that must display in front of the video. |
459 m_layer->layer()->insertChild(m_contentsLayer, 0); | 462 m_layer->layer()->insertChild(m_contentsLayer, 0); |
460 WebLayer* borderWebLayer = m_contentsClippingMaskLayer | 463 WebLayer* borderWebLayer = m_contentsClippingMaskLayer |
461 ? m_contentsClippingMaskLayer->platformLayer() | 464 ? m_contentsClippingMaskLayer->platformLayer() |
462 : 0; | 465 : 0; |
463 m_contentsLayer->setMaskLayer(borderWebLayer); | 466 m_contentsLayer->setMaskLayer(borderWebLayer); |
464 | 467 |
465 m_contentsLayer->setRenderingContext(m_renderingContext3d); | 468 m_contentsLayer->setRenderingContext(m_renderingContext3d); |
466 } | 469 } |
467 | 470 |
468 void GraphicsLayer::clearContentsLayerIfUnregistered() { | 471 void GraphicsLayer::clearContentsLayerIfUnregistered() { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
520 if (m_isTrackingRasterInvalidations) { | 523 if (m_isTrackingRasterInvalidations) { |
521 RasterInvalidationInfo info; | 524 RasterInvalidationInfo info; |
522 info.client = &client; | 525 info.client = &client; |
523 info.clientDebugName = client.debugName(); | 526 info.clientDebugName = client.debugName(); |
524 info.rect = rect; | 527 info.rect = rect; |
525 info.reason = reason; | 528 info.reason = reason; |
526 tracking.trackedRasterInvalidations.append(info); | 529 tracking.trackedRasterInvalidations.append(info); |
527 } | 530 } |
528 | 531 |
529 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { | 532 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { |
530 // TODO(crbug.com/496260): Some antialiasing effects overflows the paint inv
alidation rect. | 533 // TODO(crbug.com/496260): Some antialiasing effects overflow the paint |
| 534 // invalidation rect. |
531 IntRect r = rect; | 535 IntRect r = rect; |
532 r.inflate(1); | 536 r.inflate(1); |
533 tracking.rasterInvalidationRegionSinceLastPaint.unite(r); | 537 tracking.rasterInvalidationRegionSinceLastPaint.unite(r); |
534 } | 538 } |
535 } | 539 } |
536 | 540 |
537 template <typename T> | 541 template <typename T> |
538 static std::unique_ptr<JSONArray> pointAsJSONArray(const T& point) { | 542 static std::unique_ptr<JSONArray> pointAsJSONArray(const T& point) { |
539 std::unique_ptr<JSONArray> array = JSONArray::create(); | 543 std::unique_ptr<JSONArray> array = JSONArray::create(); |
540 array->pushDouble(point.x()); | 544 array->pushDouble(point.x()); |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 void GraphicsLayer::setOwnerNodeId(int nodeId) { | 814 void GraphicsLayer::setOwnerNodeId(int nodeId) { |
811 m_debugInfo.setOwnerNodeId(nodeId); | 815 m_debugInfo.setOwnerNodeId(nodeId); |
812 } | 816 } |
813 | 817 |
814 void GraphicsLayer::setPosition(const FloatPoint& point) { | 818 void GraphicsLayer::setPosition(const FloatPoint& point) { |
815 m_position = point; | 819 m_position = point; |
816 platformLayer()->setPosition(m_position); | 820 platformLayer()->setPosition(m_position); |
817 } | 821 } |
818 | 822 |
819 void GraphicsLayer::setSize(const FloatSize& size) { | 823 void GraphicsLayer::setSize(const FloatSize& size) { |
820 // We are receiving negative sizes here that cause assertions to fail in the c
ompositor. Clamp them to 0 to | 824 // We are receiving negative sizes here that cause assertions to fail in the |
821 // avoid those assertions. | 825 // compositor. Clamp them to 0 to avoid those assertions. |
822 // FIXME: This should be an ASSERT instead, as negative sizes should not exist
in WebCore. | 826 // FIXME: This should be an ASSERT instead, as negative sizes should not exist |
| 827 // in WebCore. |
823 FloatSize clampedSize = size; | 828 FloatSize clampedSize = size; |
824 if (clampedSize.width() < 0 || clampedSize.height() < 0) | 829 if (clampedSize.width() < 0 || clampedSize.height() < 0) |
825 clampedSize = FloatSize(); | 830 clampedSize = FloatSize(); |
826 | 831 |
827 if (clampedSize == m_size) | 832 if (clampedSize == m_size) |
828 return; | 833 return; |
829 | 834 |
830 m_size = clampedSize; | 835 m_size = clampedSize; |
831 | 836 |
832 m_layer->layer()->setBounds(flooredIntSize(m_size)); | 837 m_layer->layer()->setBounds(flooredIntSize(m_size)); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 | 872 |
868 bool GraphicsLayer::masksToBounds() const { | 873 bool GraphicsLayer::masksToBounds() const { |
869 return m_layer->layer()->masksToBounds(); | 874 return m_layer->layer()->masksToBounds(); |
870 } | 875 } |
871 | 876 |
872 void GraphicsLayer::setMasksToBounds(bool masksToBounds) { | 877 void GraphicsLayer::setMasksToBounds(bool masksToBounds) { |
873 m_layer->layer()->setMasksToBounds(masksToBounds); | 878 m_layer->layer()->setMasksToBounds(masksToBounds); |
874 } | 879 } |
875 | 880 |
876 void GraphicsLayer::setDrawsContent(bool drawsContent) { | 881 void GraphicsLayer::setDrawsContent(bool drawsContent) { |
877 // Note carefully this early-exit is only correct because we also properly cal
l | 882 // NOTE: This early-exit is only correct because we also properly call |
878 // WebLayer::setDrawsContent whenever m_contentsLayer is set to a new layer in
setupContentsLayer(). | 883 // WebLayer::setDrawsContent() whenever |m_contentsLayer| is set to a new |
| 884 // layer in setupContentsLayer(). |
879 if (drawsContent == m_drawsContent) | 885 if (drawsContent == m_drawsContent) |
880 return; | 886 return; |
881 | 887 |
882 m_drawsContent = drawsContent; | 888 m_drawsContent = drawsContent; |
883 updateLayerIsDrawable(); | 889 updateLayerIsDrawable(); |
884 | 890 |
885 if (!drawsContent && m_paintController) | 891 if (!drawsContent && m_paintController) |
886 m_paintController.reset(); | 892 m_paintController.reset(); |
887 } | 893 } |
888 | 894 |
889 void GraphicsLayer::setContentsVisible(bool contentsVisible) { | 895 void GraphicsLayer::setContentsVisible(bool contentsVisible) { |
890 // Note carefully this early-exit is only correct because we also properly cal
l | 896 // NOTE: This early-exit is only correct because we also properly call |
891 // WebLayer::setDrawsContent whenever m_contentsLayer is set to a new layer in
setupContentsLayer(). | 897 // WebLayer::setDrawsContent() whenever |m_contentsLayer| is set to a new |
| 898 // layer in setupContentsLayer(). |
892 if (contentsVisible == m_contentsVisible) | 899 if (contentsVisible == m_contentsVisible) |
893 return; | 900 return; |
894 | 901 |
895 m_contentsVisible = contentsVisible; | 902 m_contentsVisible = contentsVisible; |
896 updateLayerIsDrawable(); | 903 updateLayerIsDrawable(); |
897 } | 904 } |
898 | 905 |
899 void GraphicsLayer::setClipParent(WebLayer* parent) { | 906 void GraphicsLayer::setClipParent(WebLayer* parent) { |
900 m_hasClipParent = !!parent; | 907 m_hasClipParent = !!parent; |
901 m_layer->layer()->setClipParent(parent); | 908 m_layer->layer()->setClipParent(parent); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
976 if (WebLayer* contentsLayer = contentsLayerIfRegistered()) { | 983 if (WebLayer* contentsLayer = contentsLayerIfRegistered()) { |
977 contentsLayer->invalidate(); | 984 contentsLayer->invalidate(); |
978 trackRasterInvalidation(*this, m_contentsRect, PaintInvalidationFull); | 985 trackRasterInvalidation(*this, m_contentsRect, PaintInvalidationFull); |
979 } | 986 } |
980 } | 987 } |
981 | 988 |
982 void GraphicsLayer::setNeedsDisplay() { | 989 void GraphicsLayer::setNeedsDisplay() { |
983 if (!drawsContent()) | 990 if (!drawsContent()) |
984 return; | 991 return; |
985 | 992 |
986 // TODO(chrishtr): stop invalidating the rects once FrameView::paintRecursivel
y does so. | 993 // TODO(chrishtr): Stop invalidating the rects once |
| 994 // FrameView::paintRecursively() does so. |
987 m_layer->layer()->invalidate(); | 995 m_layer->layer()->invalidate(); |
988 for (size_t i = 0; i < m_linkHighlights.size(); ++i) | 996 for (size_t i = 0; i < m_linkHighlights.size(); ++i) |
989 m_linkHighlights[i]->invalidate(); | 997 m_linkHighlights[i]->invalidate(); |
990 getPaintController().invalidateAll(); | 998 getPaintController().invalidateAll(); |
991 | 999 |
992 trackRasterInvalidation(*this, IntRect(IntPoint(), expandedIntSize(m_size)), | 1000 trackRasterInvalidation(*this, IntRect(IntPoint(), expandedIntSize(m_size)), |
993 PaintInvalidationFull); | 1001 PaintInvalidationFull); |
994 } | 1002 } |
995 | 1003 |
996 void GraphicsLayer::setNeedsDisplayInRect( | 1004 void GraphicsLayer::setNeedsDisplayInRect( |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1106 else | 1114 else |
1107 m_layer->layer()->setScrollClient(this); | 1115 m_layer->layer()->setScrollClient(this); |
1108 } | 1116 } |
1109 | 1117 |
1110 void GraphicsLayer::didScroll() { | 1118 void GraphicsLayer::didScroll() { |
1111 if (m_scrollableArea) { | 1119 if (m_scrollableArea) { |
1112 DoublePoint newPosition = | 1120 DoublePoint newPosition = |
1113 -m_scrollableArea->scrollOrigin() + | 1121 -m_scrollableArea->scrollOrigin() + |
1114 toDoubleSize(m_layer->layer()->scrollPositionDouble()); | 1122 toDoubleSize(m_layer->layer()->scrollPositionDouble()); |
1115 | 1123 |
1116 // FrameView::setScrollPosition doesn't work for compositor commits (interac
ts poorly with programmatic scroll animations) | 1124 // FrameView::setScrollPosition() doesn't work for compositor commits |
1117 // so we need to use the ScrollableArea version. The FrameView method should
go away soon anyway. | 1125 // (interacts poorly with programmatic scroll animations) so we need to use |
| 1126 // the ScrollableArea version. The FrameView method should go away soon |
| 1127 // anyway. |
1118 m_scrollableArea->ScrollableArea::setScrollPosition(newPosition, | 1128 m_scrollableArea->ScrollableArea::setScrollPosition(newPosition, |
1119 CompositorScroll); | 1129 CompositorScroll); |
1120 } | 1130 } |
1121 } | 1131 } |
1122 | 1132 |
1123 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> | 1133 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> |
1124 GraphicsLayer::TakeDebugInfo(cc::Layer* layer) { | 1134 GraphicsLayer::TakeDebugInfo(cc::Layer* layer) { |
1125 std::unique_ptr<base::trace_event::TracedValue> tracedValue( | 1135 std::unique_ptr<base::trace_event::TracedValue> tracedValue( |
1126 m_debugInfo.asTracedValue()); | 1136 m_debugInfo.asTracedValue()); |
1127 tracedValue->SetString( | 1137 tracedValue->SetString( |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1241 *newBitmap.getAddr32(bitmapX, bitmapY) = | 1251 *newBitmap.getAddr32(bitmapX, bitmapY) = |
1242 SkColorSetARGB(0xFF, 0xA0, 0, 0); // Dark red. | 1252 SkColorSetARGB(0xFF, 0xA0, 0, 0); // Dark red. |
1243 } else { | 1253 } else { |
1244 *newBitmap.getAddr32(bitmapX, bitmapY) = SK_ColorTRANSPARENT; | 1254 *newBitmap.getAddr32(bitmapX, bitmapY) = SK_ColorTRANSPARENT; |
1245 } | 1255 } |
1246 } | 1256 } |
1247 } | 1257 } |
1248 oldBitmap.unlockPixels(); | 1258 oldBitmap.unlockPixels(); |
1249 newBitmap.unlockPixels(); | 1259 newBitmap.unlockPixels(); |
1250 | 1260 |
1251 // Visualize under-invalidations by overlaying the new bitmap (containing red
pixels indicating under-invalidations, | 1261 // Visualize under-invalidations by overlaying the new bitmap (containing red |
1252 // and transparent pixels otherwise) onto the painting. | 1262 // pixels indicating under-invalidations, and transparent pixels otherwise) |
| 1263 // onto the painting. |
1253 SkPictureRecorder recorder; | 1264 SkPictureRecorder recorder; |
1254 recorder.beginRecording(rect); | 1265 recorder.beginRecording(rect); |
1255 recorder.getRecordingCanvas()->drawBitmap(newBitmap, rect.x(), rect.y()); | 1266 recorder.getRecordingCanvas()->drawBitmap(newBitmap, rect.x(), rect.y()); |
1256 sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture(); | 1267 sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture(); |
1257 getPaintController().appendDebugDrawingAfterCommit( | 1268 getPaintController().appendDebugDrawingAfterCommit( |
1258 *this, picture, offsetFromLayoutObjectWithSubpixelAccumulation()); | 1269 *this, picture, offsetFromLayoutObjectWithSubpixelAccumulation()); |
1259 } | 1270 } |
1260 | 1271 |
1261 } // namespace blink | 1272 } // namespace blink |
1262 | 1273 |
1263 #ifndef NDEBUG | 1274 #ifndef NDEBUG |
1264 void showGraphicsLayerTree(const blink::GraphicsLayer* layer) { | 1275 void showGraphicsLayerTree(const blink::GraphicsLayer* layer) { |
1265 if (!layer) { | 1276 if (!layer) { |
1266 fprintf(stderr, "Cannot showGraphicsLayerTree for (nil).\n"); | 1277 fprintf(stderr, "Cannot showGraphicsLayerTree for (nil).\n"); |
1267 return; | 1278 return; |
1268 } | 1279 } |
1269 | 1280 |
1270 String output = layer->layerTreeAsText(blink::LayerTreeIncludesDebugInfo); | 1281 String output = layer->layerTreeAsText(blink::LayerTreeIncludesDebugInfo); |
1271 fprintf(stderr, "%s\n", output.utf8().data()); | 1282 fprintf(stderr, "%s\n", output.utf8().data()); |
1272 } | 1283 } |
1273 #endif | 1284 #endif |
OLD | NEW |