Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(51)

Side by Side Diff: third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp

Issue 2238883006: SPv2: Use GeometryMapper to implement PaintLayerClipper. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: none Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/paint/PaintLayerPainter.h" 5 #include "core/paint/PaintLayerPainter.h"
6 6
7 #include "core/frame/LocalFrame.h" 7 #include "core/frame/LocalFrame.h"
8 #include "core/layout/LayoutInline.h" 8 #include "core/layout/LayoutInline.h"
9 #include "core/layout/LayoutView.h" 9 #include "core/layout/LayoutView.h"
10 #include "core/paint/ClipPathClipper.h" 10 #include "core/paint/ClipPathClipper.h"
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 return FullyPainted; 96 return FullyPainted;
97 97
98 // If this layer is totally invisible then there is nothing to paint. 98 // If this layer is totally invisible then there is nothing to paint.
99 if (!m_paintLayer.layoutObject()->opacity() && 99 if (!m_paintLayer.layoutObject()->opacity() &&
100 !m_paintLayer.layoutObject()->hasBackdropFilter()) 100 !m_paintLayer.layoutObject()->hasBackdropFilter())
101 return FullyPainted; 101 return FullyPainted;
102 102
103 if (m_paintLayer.paintsWithTransparency(paintingInfo.getGlobalPaintFlags())) 103 if (m_paintLayer.paintsWithTransparency(paintingInfo.getGlobalPaintFlags()))
104 paintFlags |= PaintLayerHaveTransparency; 104 paintFlags |= PaintLayerHaveTransparency;
105 105
106 // Transforms will be applied by property nodes directly for SPv2. 106 if (m_paintLayer.paintsWithTransform(paintingInfo.getGlobalPaintFlags()) &&
107 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled() &&
108 m_paintLayer.paintsWithTransform(paintingInfo.getGlobalPaintFlags()) &&
109 !(paintFlags & PaintLayerAppliedTransform)) 107 !(paintFlags & PaintLayerAppliedTransform))
110 return paintLayerWithTransform(context, paintingInfo, paintFlags); 108 return paintLayerWithTransform(context, paintingInfo, paintFlags);
111 109
112 return paintLayerContentsCompositingAllPhases(context, paintingInfo, 110 return paintLayerContentsCompositingAllPhases(context, paintingInfo,
113 paintFlags); 111 paintFlags);
114 } 112 }
115 113
116 PaintLayerPainter::PaintResult 114 PaintLayerPainter::PaintResult
117 PaintLayerPainter::paintLayerContentsCompositingAllPhases( 115 PaintLayerPainter::paintLayerContentsCompositingAllPhases(
118 GraphicsContext& context, 116 GraphicsContext& context,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 185
188 // Repaint subsequence if the layer is marked for needing repaint. 186 // Repaint subsequence if the layer is marked for needing repaint.
189 // We don't set needsResetEmptyPaintPhase here, but clear the empty paint 187 // We don't set needsResetEmptyPaintPhase here, but clear the empty paint
190 // phase flags in PaintLayer::setNeedsPaintPhaseXXX(), to ensure that we won't 188 // phase flags in PaintLayer::setNeedsPaintPhaseXXX(), to ensure that we won't
191 // clear previousPaintPhaseXXXEmpty flags when unrelated things changed which 189 // clear previousPaintPhaseXXXEmpty flags when unrelated things changed which
192 // won't cause the paint phases to become non-empty. 190 // won't cause the paint phases to become non-empty.
193 if (paintLayer.needsRepaint()) 191 if (paintLayer.needsRepaint())
194 needsRepaint = true; 192 needsRepaint = true;
195 193
196 // Repaint if layer's clip changes. 194 // Repaint if layer's clip changes.
197 ClipRects& clipRects = paintLayer.clipper().paintingClipRects( 195 // TODO(chrishtr): implement detecting clipping changes in SPv2.
198 paintingInfo.rootLayer, respectOverflowClip, subpixelAccumulation); 196 // crbug.com/645667
199 ClipRects* previousClipRects = paintLayer.previousPaintingClipRects(); 197 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
200 if (&clipRects != previousClipRects && 198 ClipRects& clipRects = paintLayer.clipper().paintingClipRects(
201 (!previousClipRects || clipRects != *previousClipRects)) { 199 paintingInfo.rootLayer, respectOverflowClip, subpixelAccumulation);
202 needsRepaint = true; 200 ClipRects* previousClipRects = paintLayer.previousPaintingClipRects();
203 shouldClearEmptyPaintPhaseFlags = true; 201 if (&clipRects != previousClipRects &&
202 (!previousClipRects || clipRects != *previousClipRects)) {
203 needsRepaint = true;
204 shouldClearEmptyPaintPhaseFlags = true;
205 }
206 paintLayer.setPreviousPaintingClipRects(clipRects);
204 } 207 }
205 paintLayer.setPreviousPaintingClipRects(clipRects);
206 208
207 // Repaint if previously the layer might be clipped by paintDirtyRect and 209 // Repaint if previously the layer might be clipped by paintDirtyRect and
208 // paintDirtyRect changes. 210 // paintDirtyRect changes.
209 if (paintLayer.previousPaintResult() == 211 if (paintLayer.previousPaintResult() ==
210 PaintLayerPainter::MayBeClippedByPaintDirtyRect && 212 PaintLayerPainter::MayBeClippedByPaintDirtyRect &&
211 paintLayer.previousPaintDirtyRect() != paintingInfo.paintDirtyRect) { 213 paintLayer.previousPaintDirtyRect() != paintingInfo.paintDirtyRect) {
212 needsRepaint = true; 214 needsRepaint = true;
213 shouldClearEmptyPaintPhaseFlags = true; 215 shouldClearEmptyPaintPhaseFlags = true;
214 } 216 }
215 paintLayer.setPreviousPaintDirtyRect(paintingInfo.paintDirtyRect); 217 paintLayer.setPreviousPaintDirtyRect(paintingInfo.paintDirtyRect);
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 localPaintingInfo.paintDirtyRect, cacheSlot, 391 localPaintingInfo.paintDirtyRect, cacheSlot,
390 IgnoreOverlayScrollbarSize, respectOverflowClip, &offsetFromRoot, 392 IgnoreOverlayScrollbarSize, respectOverflowClip, &offsetFromRoot,
391 localPaintingInfo.subPixelAccumulation); 393 localPaintingInfo.subPixelAccumulation);
392 else 394 else
393 m_paintLayer.collectFragments(layerFragments, localPaintingInfo.rootLayer, 395 m_paintLayer.collectFragments(layerFragments, localPaintingInfo.rootLayer,
394 localPaintingInfo.paintDirtyRect, cacheSlot, 396 localPaintingInfo.paintDirtyRect, cacheSlot,
395 IgnoreOverlayScrollbarSize, 397 IgnoreOverlayScrollbarSize,
396 respectOverflowClip, &offsetFromRoot, 398 respectOverflowClip, &offsetFromRoot,
397 localPaintingInfo.subPixelAccumulation); 399 localPaintingInfo.subPixelAccumulation);
398 400
399 // TODO(trchen): Needs to adjust cull rect between transform spaces.
400 // https://crbug.com/593596
401 // Disables layer culling for SPv2 for now because the space of the cull
402 // rect doesn't match the space we paint in. Clipping will still be done by
403 // clip nodes, so this won't cause rendering issues, only performance.
404 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
405 layerFragments[0].backgroundRect =
406 LayoutRect(LayoutRect::infiniteIntRect());
407 layerFragments[0].foregroundRect =
408 LayoutRect(LayoutRect::infiniteIntRect());
409 }
410
411 if (shouldPaintContent) { 401 if (shouldPaintContent) {
412 // TODO(wangxianzhu): This is for old slow scrolling. Implement similar 402 // TODO(wangxianzhu): This is for old slow scrolling. Implement similar
413 // optimization for slimming paint v2. 403 // optimization for slimming paint v2.
414 shouldPaintContent = atLeastOneFragmentIntersectsDamageRect( 404 shouldPaintContent = atLeastOneFragmentIntersectsDamageRect(
415 layerFragments, localPaintingInfo, paintFlags, offsetFromRoot); 405 layerFragments, localPaintingInfo, paintFlags, offsetFromRoot);
416 if (!shouldPaintContent) 406 if (!shouldPaintContent)
417 result = MayBeClippedByPaintDirtyRect; 407 result = MayBeClippedByPaintDirtyRect;
418 } 408 }
419 } 409 }
420 410
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 newOffsetFromRoot)) 547 newOffsetFromRoot))
558 return true; 548 return true;
559 } 549 }
560 return false; 550 return false;
561 } 551 }
562 552
563 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayerWithTransform( 553 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayerWithTransform(
564 GraphicsContext& context, 554 GraphicsContext& context,
565 const PaintLayerPaintingInfo& paintingInfo, 555 const PaintLayerPaintingInfo& paintingInfo,
566 PaintLayerFlags paintFlags) { 556 PaintLayerFlags paintFlags) {
567 // Transforms will be applied by property nodes directly for SPv2.
568 ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled());
569
570 TransformationMatrix layerTransform = 557 TransformationMatrix layerTransform =
571 m_paintLayer.renderableTransform(paintingInfo.getGlobalPaintFlags()); 558 m_paintLayer.renderableTransform(paintingInfo.getGlobalPaintFlags());
572 // If the transform can't be inverted, then don't paint anything. 559 // If the transform can't be inverted, then don't paint anything.
573 if (!layerTransform.isInvertible()) 560 if (!layerTransform.isInvertible())
574 return FullyPainted; 561 return FullyPainted;
575 562
576 // FIXME: We should make sure that we don't walk past paintingInfo.rootLayer 563 // FIXME: We should make sure that we don't walk past paintingInfo.rootLayer
577 // here. m_paintLayer may be the "root", and then we should avoid looking at 564 // here. m_paintLayer may be the "root", and then we should avoid looking at
578 // its parent. 565 // its parent.
579 PaintLayer* parentLayer = m_paintLayer.parent(); 566 PaintLayer* parentLayer = m_paintLayer.parent();
580 567
581 ClipRect ancestorBackgroundClipRect;
582 if (parentLayer) {
583 // Calculate the clip rectangle that the ancestors establish.
584 ClipRectsContext clipRectsContext(paintingInfo.rootLayer,
585 (paintFlags & PaintLayerUncachedClipRects)
586 ? UncachedClipRects
587 : PaintingClipRects,
588 IgnoreOverlayScrollbarSize);
589 if (shouldRespectOverflowClip(paintFlags, m_paintLayer.layoutObject()) ==
590 IgnoreOverflowClip)
591 clipRectsContext.setIgnoreOverflowClip();
592 ancestorBackgroundClipRect =
593 m_paintLayer.clipper().backgroundClipRect(clipRectsContext);
594 }
595
596 LayoutObject* object = m_paintLayer.layoutObject(); 568 LayoutObject* object = m_paintLayer.layoutObject();
597 LayoutView* view = object->view(); 569 LayoutView* view = object->view();
598 bool isFixedPosObjectInPagedMedia = 570 bool isFixedPosObjectInPagedMedia =
599 object->style()->position() == FixedPosition && 571 object->style()->position() == FixedPosition &&
600 object->container() == view && view->pageLogicalHeight(); 572 object->container() == view && view->pageLogicalHeight();
601 PaintLayer* paginationLayer = m_paintLayer.enclosingPaginationLayer(); 573 PaintLayer* paginationLayer = m_paintLayer.enclosingPaginationLayer();
602 PaintLayerFragments fragments; 574 PaintLayerFragments fragments;
603 // TODO(crbug.com/619094): Figure out the correct behaviour for fixed position 575 // TODO(crbug.com/619094): Figure out the correct behaviour for fixed position
604 // objects in paged media with vertical writing modes. 576 // objects in paged media with vertical writing modes.
605 if (isFixedPosObjectInPagedMedia && view->isHorizontalWritingMode()) { 577 if (isFixedPosObjectInPagedMedia && view->isHorizontalWritingMode()) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 // path, when the transform has been applied. 615 // path, when the transform has been applied.
644 PaintLayerFragment fragment; 616 PaintLayerFragment fragment;
645 fragment.backgroundRect = paintingInfo.paintDirtyRect; 617 fragment.backgroundRect = paintingInfo.paintDirtyRect;
646 fragments.append(fragment); 618 fragments.append(fragment);
647 } 619 }
648 620
649 Optional<DisplayItemCacheSkipper> cacheSkipper; 621 Optional<DisplayItemCacheSkipper> cacheSkipper;
650 if (fragments.size() > 1) 622 if (fragments.size() > 1)
651 cacheSkipper.emplace(context); 623 cacheSkipper.emplace(context);
652 624
625 ClipRect ancestorBackgroundClipRect;
626 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
627 if (parentLayer) {
628 // Calculate the clip rectangle that the ancestors establish.
629 ClipRectsContext clipRectsContext(
630 paintingInfo.rootLayer,
631 (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects
632 : PaintingClipRects,
633 IgnoreOverlayScrollbarSize);
634 if (shouldRespectOverflowClip(paintFlags, m_paintLayer.layoutObject()) ==
635 IgnoreOverflowClip)
636 clipRectsContext.setIgnoreOverflowClip();
637 ancestorBackgroundClipRect =
638 m_paintLayer.clipper().backgroundClipRect(clipRectsContext);
639 }
640 }
641
653 PaintResult result = FullyPainted; 642 PaintResult result = FullyPainted;
654 for (const auto& fragment : fragments) { 643 for (const auto& fragment : fragments) {
655 Optional<LayerClipRecorder> clipRecorder; 644 Optional<LayerClipRecorder> clipRecorder;
656 if (parentLayer) { 645 if (parentLayer && !RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
657 ClipRect clipRectForFragment(ancestorBackgroundClipRect); 646 ClipRect clipRectForFragment(ancestorBackgroundClipRect);
658 // A fixed-position object is repeated on every page, but if it is clipped 647 // A fixed-position object is repeated on every page, but if it is clipped
659 // by an ancestor layer then the repetitions are clipped out. 648 // by an ancestor layer then the repetitions are clipped out.
660 if (!isFixedPosObjectInPagedMedia) 649 if (!isFixedPosObjectInPagedMedia)
661 clipRectForFragment.moveBy(fragment.paginationOffset); 650 clipRectForFragment.moveBy(fragment.paginationOffset);
662 clipRectForFragment.intersect(fragment.backgroundRect); 651 clipRectForFragment.intersect(fragment.backgroundRect);
663 if (clipRectForFragment.isEmpty()) 652 if (clipRectForFragment.isEmpty())
664 continue; 653 continue;
665 if (needsToClip(paintingInfo, clipRectForFragment)) { 654 if (needsToClip(paintingInfo, clipRectForFragment)) {
666 if (m_paintLayer.layoutObject()->isPositioned() && 655 if (m_paintLayer.layoutObject()->isPositioned() &&
(...skipping 16 matching lines...) Expand all
683 } 672 }
684 return result; 673 return result;
685 } 674 }
686 675
687 PaintLayerPainter::PaintResult 676 PaintLayerPainter::PaintResult
688 PaintLayerPainter::paintFragmentByApplyingTransform( 677 PaintLayerPainter::paintFragmentByApplyingTransform(
689 GraphicsContext& context, 678 GraphicsContext& context,
690 const PaintLayerPaintingInfo& paintingInfo, 679 const PaintLayerPaintingInfo& paintingInfo,
691 PaintLayerFlags paintFlags, 680 PaintLayerFlags paintFlags,
692 const LayoutPoint& fragmentTranslation) { 681 const LayoutPoint& fragmentTranslation) {
693 // Transforms will be applied by property nodes directly for SPv2.
694 ASSERT(!RuntimeEnabledFeatures::slimmingPaintV2Enabled());
695
696 // This involves subtracting out the position of the layer in our current 682 // This involves subtracting out the position of the layer in our current
697 // coordinate space, but preserving the accumulated error for sub-pixel 683 // coordinate space, but preserving the accumulated error for sub-pixel
698 // layout. 684 // layout.
699 LayoutPoint delta; 685 LayoutPoint delta;
700 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, delta); 686 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, delta);
701 delta.moveBy(fragmentTranslation); 687 delta.moveBy(fragmentTranslation);
702 TransformationMatrix transform( 688 TransformationMatrix transform(
703 m_paintLayer.renderableTransform(paintingInfo.getGlobalPaintFlags())); 689 m_paintLayer.renderableTransform(paintingInfo.getGlobalPaintFlags()));
704 IntPoint roundedDelta = roundedIntPoint(delta); 690 IntPoint roundedDelta = roundedIntPoint(delta);
705 transform.translateRight(roundedDelta.x(), roundedDelta.y()); 691 transform.translateRight(roundedDelta.x(), roundedDelta.y());
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 Optional<DisplayItemCacheSkipper> cacheSkipper; 790 Optional<DisplayItemCacheSkipper> cacheSkipper;
805 if (layerFragments.size() > 1) 791 if (layerFragments.size() > 1)
806 cacheSkipper.emplace(context); 792 cacheSkipper.emplace(context);
807 793
808 for (auto& fragment : layerFragments) { 794 for (auto& fragment : layerFragments) {
809 // We need to apply the same clips and transforms that 795 // We need to apply the same clips and transforms that
810 // paintFragmentWithPhase would have. 796 // paintFragmentWithPhase would have.
811 LayoutRect cullRect = fragment.backgroundRect.rect(); 797 LayoutRect cullRect = fragment.backgroundRect.rect();
812 798
813 Optional<LayerClipRecorder> clipRecorder; 799 Optional<LayerClipRecorder> clipRecorder;
814 if (needsToClip(localPaintingInfo, fragment.backgroundRect)) 800 if (needsToClip(localPaintingInfo, fragment.backgroundRect)) {
815 clipRecorder.emplace(context, *m_paintLayer.layoutObject(), 801 clipRecorder.emplace(context, *m_paintLayer.layoutObject(),
816 DisplayItem::kClipLayerOverflowControls, 802 DisplayItem::kClipLayerOverflowControls,
817 fragment.backgroundRect, &localPaintingInfo, 803 fragment.backgroundRect, &localPaintingInfo,
818 fragment.paginationOffset, paintFlags); 804 fragment.paginationOffset, paintFlags);
805 }
819 806
820 Optional<ScrollRecorder> scrollRecorder; 807 Optional<ScrollRecorder> scrollRecorder;
821 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled() && 808 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled() &&
822 !localPaintingInfo.scrollOffsetAccumulation.isZero()) { 809 !localPaintingInfo.scrollOffsetAccumulation.isZero()) {
823 cullRect.move(localPaintingInfo.scrollOffsetAccumulation); 810 cullRect.move(localPaintingInfo.scrollOffsetAccumulation);
824 scrollRecorder.emplace(context, *m_paintLayer.layoutObject(), 811 scrollRecorder.emplace(context, *m_paintLayer.layoutObject(),
825 DisplayItem::kScrollOverflowControls, 812 DisplayItem::kScrollOverflowControls,
826 localPaintingInfo.scrollOffsetAccumulation); 813 localPaintingInfo.scrollOffsetAccumulation);
827 } 814 }
828 815
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
871 LayoutRect newCullRect(clipRect.rect()); 858 LayoutRect newCullRect(clipRect.rect());
872 Optional<ScrollRecorder> scrollRecorder; 859 Optional<ScrollRecorder> scrollRecorder;
873 LayoutPoint paintOffset = -m_paintLayer.layoutBoxLocation(); 860 LayoutPoint paintOffset = -m_paintLayer.layoutBoxLocation();
874 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { 861 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
875 const ObjectPaintProperties* objectPaintProperties = 862 const ObjectPaintProperties* objectPaintProperties =
876 m_paintLayer.layoutObject()->objectPaintProperties(); 863 m_paintLayer.layoutObject()->objectPaintProperties();
877 ASSERT(objectPaintProperties && 864 ASSERT(objectPaintProperties &&
878 objectPaintProperties->localBorderBoxProperties()); 865 objectPaintProperties->localBorderBoxProperties());
879 paintOffset += 866 paintOffset +=
880 toSize(objectPaintProperties->localBorderBoxProperties()->paintOffset); 867 toSize(objectPaintProperties->localBorderBoxProperties()->paintOffset);
868 newCullRect.move(paintingInfo.scrollOffsetAccumulation);
881 } else { 869 } else {
882 paintOffset += toSize(fragment.layerBounds.location()); 870 paintOffset += toSize(fragment.layerBounds.location());
883 if (!paintingInfo.scrollOffsetAccumulation.isZero()) { 871 if (!paintingInfo.scrollOffsetAccumulation.isZero()) {
884 // As a descendant of the root layer, m_paintLayer's painting is not 872 // As a descendant of the root layer, m_paintLayer's painting is not
885 // controlled by the ScrollRecorders created by BlockPainter of the 873 // controlled by the ScrollRecorders created by BlockPainter of the
886 // ancestor layers up to the root layer, so we need to issue 874 // ancestor layers up to the root layer, so we need to issue
887 // ScrollRecorder for this layer seperately, with the scroll offset 875 // ScrollRecorder for this layer seperately, with the scroll offset
888 // accumulated from the root layer to the parent of this layer, to get the 876 // accumulated from the root layer to the parent of this layer, to get the
889 // same result as ScrollRecorder in BlockPainter. 877 // same result as ScrollRecorder in BlockPainter.
890 paintOffset += paintingInfo.scrollOffsetAccumulation; 878 paintOffset += paintingInfo.scrollOffsetAccumulation;
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
1076 1064
1077 PaintLayerPaintingInfo paintingInfo(&m_paintLayer, 1065 PaintLayerPaintingInfo paintingInfo(&m_paintLayer,
1078 LayoutRect(enclosingIntRect(damageRect)), 1066 LayoutRect(enclosingIntRect(damageRect)),
1079 paintFlags, LayoutSize()); 1067 paintFlags, LayoutSize());
1080 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); 1068 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars);
1081 1069
1082 m_paintLayer.setContainsDirtyOverlayScrollbars(false); 1070 m_paintLayer.setContainsDirtyOverlayScrollbars(false);
1083 } 1071 }
1084 1072
1085 } // namespace blink 1073 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp ('k') | third_party/WebKit/Source/core/testing/Internals.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698