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

Side by Side Diff: Source/core/paint/LayerPainter.cpp

Issue 899163003: Move rendering/RenderObject to layout/LayoutObject. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/paint/LayerPainter.h ('k') | Source/core/paint/ListMarkerPainter.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "config.h" 5 #include "config.h"
6 #include "core/paint/LayerPainter.h" 6 #include "core/paint/LayerPainter.h"
7 7
8 #include "core/frame/Settings.h" 8 #include "core/frame/Settings.h"
9 #include "core/layout/Layer.h" 9 #include "core/layout/Layer.h"
10 #include "core/page/Page.h" 10 #include "core/page/Page.h"
(...skipping 21 matching lines...) Expand all
32 { 32 {
33 // Avoid painting descendants of the root layer when stylesheets haven't loa ded. This eliminates FOUC. 33 // Avoid painting descendants of the root layer when stylesheets haven't loa ded. This eliminates FOUC.
34 // It's ok not to draw, because later on, when all the stylesheets do load, updateStyleSelector on the Document 34 // It's ok not to draw, because later on, when all the stylesheets do load, updateStyleSelector on the Document
35 // will do a full paintInvalidationForWholeRenderer(). 35 // will do a full paintInvalidationForWholeRenderer().
36 if (layer->renderer()->document().didLayoutWithPendingStylesheets() && !laye r->isRootLayer() && !layer->renderer()->isDocumentElement()) 36 if (layer->renderer()->document().didLayoutWithPendingStylesheets() && !laye r->isRootLayer() && !layer->renderer()->isDocumentElement())
37 return true; 37 return true;
38 38
39 return false; 39 return false;
40 } 40 }
41 41
42 void LayerPainter::paint(GraphicsContext* context, const LayoutRect& damageRect, PaintBehavior paintBehavior, RenderObject* paintingRoot, PaintLayerFlags paintF lags) 42 void LayerPainter::paint(GraphicsContext* context, const LayoutRect& damageRect, PaintBehavior paintBehavior, LayoutObject* paintingRoot, PaintLayerFlags paintF lags)
43 { 43 {
44 LayerPaintingInfo paintingInfo(&m_renderLayer, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot); 44 LayerPaintingInfo paintingInfo(&m_renderLayer, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot);
45 if (shouldPaintLayerInSoftwareMode(paintingInfo, paintFlags)) 45 if (shouldPaintLayerInSoftwareMode(paintingInfo, paintFlags))
46 paintLayer(context, paintingInfo, paintFlags); 46 paintLayer(context, paintingInfo, paintFlags);
47 } 47 }
48 48
49 static ShouldRespectOverflowClip shouldRespectOverflowClip(PaintLayerFlags paint Flags, const RenderObject* renderer) 49 static ShouldRespectOverflowClip shouldRespectOverflowClip(PaintLayerFlags paint Flags, const LayoutObject* renderer)
50 { 50 {
51 return (paintFlags & PaintLayerPaintingOverflowContents || (paintFlags & Pai ntLayerPaintingChildClippingMaskPhase && renderer->hasClipPath())) ? IgnoreOverf lowClip : RespectOverflowClip; 51 return (paintFlags & PaintLayerPaintingOverflowContents || (paintFlags & Pai ntLayerPaintingChildClippingMaskPhase && renderer->hasClipPath())) ? IgnoreOverf lowClip : RespectOverflowClip;
52 } 52 }
53 53
54 void LayerPainter::paintLayer(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) 54 void LayerPainter::paintLayer(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
55 { 55 {
56 // https://code.google.com/p/chromium/issues/detail?id=343772 56 // https://code.google.com/p/chromium/issues/detail?id=343772
57 DisableCompositingQueryAsserts disabler; 57 DisableCompositingQueryAsserts disabler;
58 58
59 if (m_renderLayer.compositingState() != NotComposited) { 59 if (m_renderLayer.compositingState() != NotComposited) {
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer()), &of fsetFromRoot, localPaintingInfo.subPixelAccumulation); 234 shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer()), &of fsetFromRoot, localPaintingInfo.subPixelAccumulation);
235 if (shouldPaintContent) 235 if (shouldPaintContent)
236 shouldPaintContent = atLeastOneFragmentIntersectsDamageRect(layerFra gments, localPaintingInfo, paintFlags, offsetFromRoot); 236 shouldPaintContent = atLeastOneFragmentIntersectsDamageRect(layerFra gments, localPaintingInfo, paintFlags, offsetFromRoot);
237 } 237 }
238 238
239 bool selectionOnly = localPaintingInfo.paintBehavior & PaintBehaviorSelectio nOnly; 239 bool selectionOnly = localPaintingInfo.paintBehavior & PaintBehaviorSelectio nOnly;
240 // If this layer's renderer is a child of the paintingRoot, we render uncond itionally, which 240 // If this layer's renderer is a child of the paintingRoot, we render uncond itionally, which
241 // is done by passing a nil paintingRoot down to our renderer (as if no pain tingRoot was ever set). 241 // is done by passing a nil paintingRoot down to our renderer (as if no pain tingRoot was ever set).
242 // Else, our renderer tree may or may not contain the painting root, so we p ass that root along 242 // Else, our renderer tree may or may not contain the painting root, so we p ass that root along
243 // so it will be tested against as we descend through the renderers. 243 // so it will be tested against as we descend through the renderers.
244 RenderObject* paintingRootForRenderer = 0; 244 LayoutObject* paintingRootForRenderer = 0;
245 if (localPaintingInfo.paintingRoot && !m_renderLayer.renderer()->isDescendan tOf(localPaintingInfo.paintingRoot)) 245 if (localPaintingInfo.paintingRoot && !m_renderLayer.renderer()->isDescendan tOf(localPaintingInfo.paintingRoot))
246 paintingRootForRenderer = localPaintingInfo.paintingRoot; 246 paintingRootForRenderer = localPaintingInfo.paintingRoot;
247 247
248 { // Begin block for the lifetime of any filter. 248 { // Begin block for the lifetime of any filter.
249 FilterPainter filterPainter(m_renderLayer, context, offsetFromRoot, laye rFragments.isEmpty() ? ClipRect() : layerFragments[0].backgroundRect, localPaint ingInfo, paintFlags, 249 FilterPainter filterPainter(m_renderLayer, context, offsetFromRoot, laye rFragments.isEmpty() ? ClipRect() : layerFragments[0].backgroundRect, localPaint ingInfo, paintFlags,
250 rootRelativeBounds, rootRelativeBoundsComputed); 250 rootRelativeBounds, rootRelativeBoundsComputed);
251 251
252 ASSERT(!(localPaintingInfo.paintBehavior & PaintBehaviorForceBlackText)) ; 252 ASSERT(!(localPaintingInfo.paintBehavior & PaintBehaviorForceBlackText)) ;
253 253
254 bool shouldPaintBackground = isPaintingCompositedBackground && shouldPai ntContent && !selectionOnly; 254 bool shouldPaintBackground = isPaintingCompositedBackground && shouldPai ntContent && !selectionOnly;
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 596
597 // Move to the next position. 597 // Move to the next position.
598 LayoutUnit blockDelta = isHorizontal ? colRect.height() : colRect.width( ); 598 LayoutUnit blockDelta = isHorizontal ? colRect.height() : colRect.width( );
599 if (columnBlock->style()->isFlippedBlocksWritingMode()) 599 if (columnBlock->style()->isFlippedBlocksWritingMode())
600 currLogicalTopOffset += blockDelta; 600 currLogicalTopOffset += blockDelta;
601 else 601 else
602 currLogicalTopOffset -= blockDelta; 602 currLogicalTopOffset -= blockDelta;
603 } 603 }
604 } 604 }
605 605
606 void LayerPainter::paintFragmentWithPhase(PaintPhase phase, const LayerFragment& fragment, GraphicsContext* context, const ClipRect& clipRect, const LayerPainti ngInfo& paintingInfo, PaintBehavior paintBehavior, RenderObject* paintingRootFor Renderer, PaintLayerFlags paintFlags, ClipState clipState) 606 void LayerPainter::paintFragmentWithPhase(PaintPhase phase, const LayerFragment& fragment, GraphicsContext* context, const ClipRect& clipRect, const LayerPainti ngInfo& paintingInfo, PaintBehavior paintBehavior, LayoutObject* paintingRootFor Renderer, PaintLayerFlags paintFlags, ClipState clipState)
607 { 607 {
608 OwnPtr<LayerClipRecorder> clipRecorder; 608 OwnPtr<LayerClipRecorder> clipRecorder;
609 if (clipState != HasClipped && paintingInfo.clipToDirtyRect && needsToClip(p aintingInfo, clipRect)) { 609 if (clipState != HasClipped && paintingInfo.clipToDirtyRect && needsToClip(p aintingInfo, clipRect)) {
610 DisplayItem::Type clipType = DisplayItem::paintPhaseToClipLayerFragmentT ype(phase); 610 DisplayItem::Type clipType = DisplayItem::paintPhaseToClipLayerFragmentT ype(phase);
611 LayerClipRecorder::BorderRadiusClippingRule clippingRule; 611 LayerClipRecorder::BorderRadiusClippingRule clippingRule;
612 switch (phase) { 612 switch (phase) {
613 case PaintPhaseBlockBackground: // Background painting will handle clipp ing to self. 613 case PaintPhaseBlockBackground: // Background painting will handle clipp ing to self.
614 case PaintPhaseSelfOutline: 614 case PaintPhaseSelfOutline:
615 case PaintPhaseMask: // Mask painting will handle clipping to self. 615 case PaintPhaseMask: // Mask painting will handle clipping to self.
616 clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius; 616 clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius;
617 break; 617 break;
618 default: 618 default:
619 clippingRule = LayerClipRecorder::IncludeSelfForBorderRadius; 619 clippingRule = LayerClipRecorder::IncludeSelfForBorderRadius;
620 break; 620 break;
621 } 621 }
622 622
623 clipRecorder = adoptPtr(new LayerClipRecorder(m_renderLayer.renderer(), context, clipType, clipRect, &paintingInfo, fragment.paginationOffset, paintFlag s, clippingRule)); 623 clipRecorder = adoptPtr(new LayerClipRecorder(m_renderLayer.renderer(), context, clipType, clipRect, &paintingInfo, fragment.paginationOffset, paintFlag s, clippingRule));
624 } 624 }
625 625
626 PaintInfo paintInfo(context, pixelSnappedIntRect(clipRect.rect()), phase, pa intBehavior, paintingRootForRenderer, 0, paintingInfo.rootLayer->renderer()); 626 PaintInfo paintInfo(context, pixelSnappedIntRect(clipRect.rect()), phase, pa intBehavior, paintingRootForRenderer, 0, paintingInfo.rootLayer->renderer());
627 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds.loca tion() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(painti ngInfo.subPixelAccumulation, m_renderLayer.compositingState()))); 627 m_renderLayer.renderer()->paint(paintInfo, toPoint(fragment.layerBounds.loca tion() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(painti ngInfo.subPixelAccumulation, m_renderLayer.compositingState())));
628 } 628 }
629 629
630 void LayerPainter::paintBackgroundForFragments(const LayerFragments& layerFragme nts, GraphicsContext* context, 630 void LayerPainter::paintBackgroundForFragments(const LayerFragments& layerFragme nts, GraphicsContext* context,
631 const LayoutRect& transparencyPaintDirtyRect, const LayerPaintingInfo& local PaintingInfo, PaintBehavior paintBehavior, 631 const LayoutRect& transparencyPaintDirtyRect, const LayerPaintingInfo& local PaintingInfo, PaintBehavior paintBehavior,
632 RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags) 632 LayoutObject* paintingRootForRenderer, PaintLayerFlags paintFlags)
633 { 633 {
634 for (const auto& fragment: layerFragments) { 634 for (const auto& fragment: layerFragments) {
635 paintFragmentWithPhase(PaintPhaseBlockBackground, fragment, context, fra gment.backgroundRect, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags, HasNotClipped); 635 paintFragmentWithPhase(PaintPhaseBlockBackground, fragment, context, fra gment.backgroundRect, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags, HasNotClipped);
636 } 636 }
637 } 637 }
638 638
639 void LayerPainter::paintForegroundForFragments(const LayerFragments& layerFragme nts, GraphicsContext* context, 639 void LayerPainter::paintForegroundForFragments(const LayerFragments& layerFragme nts, GraphicsContext* context,
640 const LayoutRect& transparencyPaintDirtyRect, const LayerPaintingInfo& local PaintingInfo, PaintBehavior paintBehavior, 640 const LayoutRect& transparencyPaintDirtyRect, const LayerPaintingInfo& local PaintingInfo, PaintBehavior paintBehavior,
641 RenderObject* paintingRootForRenderer, bool selectionOnly, PaintLayerFlags p aintFlags) 641 LayoutObject* paintingRootForRenderer, bool selectionOnly, PaintLayerFlags p aintFlags)
642 { 642 {
643 // Optimize clipping for the single fragment case. 643 // Optimize clipping for the single fragment case.
644 bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size() == 1 && !layerFragments[0].foregroundRect.isEmpty(); 644 bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size() == 1 && !layerFragments[0].foregroundRect.isEmpty();
645 ClipState clipState = HasNotClipped; 645 ClipState clipState = HasNotClipped;
646 OwnPtr<LayerClipRecorder> clipRecorder; 646 OwnPtr<LayerClipRecorder> clipRecorder;
647 if (shouldClip && needsToClip(localPaintingInfo, layerFragments[0].foregroun dRect)) { 647 if (shouldClip && needsToClip(localPaintingInfo, layerFragments[0].foregroun dRect)) {
648 clipRecorder = adoptPtr(new LayerClipRecorder(m_renderLayer.renderer(), context, DisplayItem::ClipLayerForeground, layerFragments[0].foregroundRect, &lo calPaintingInfo, layerFragments[0].paginationOffset, paintFlags)); 648 clipRecorder = adoptPtr(new LayerClipRecorder(m_renderLayer.renderer(), context, DisplayItem::ClipLayerForeground, layerFragments[0].foregroundRect, &lo calPaintingInfo, layerFragments[0].paginationOffset, paintFlags));
649 clipState = HasClipped; 649 clipState = HasClipped;
650 } 650 }
651 651
652 // We have to loop through every fragment multiple times, since we have to i ssue paint invalidations in each specific phase in order for 652 // We have to loop through every fragment multiple times, since we have to i ssue paint invalidations in each specific phase in order for
653 // interleaving of the fragments to work properly. 653 // interleaving of the fragments to work properly.
654 paintForegroundForFragmentsWithPhase(selectionOnly ? PaintPhaseSelection : P aintPhaseChildBlockBackgrounds, layerFragments, 654 paintForegroundForFragmentsWithPhase(selectionOnly ? PaintPhaseSelection : P aintPhaseChildBlockBackgrounds, layerFragments,
655 context, localPaintingInfo, paintBehavior, paintingRootForRenderer, pain tFlags, clipState); 655 context, localPaintingInfo, paintBehavior, paintingRootForRenderer, pain tFlags, clipState);
656 656
657 if (!selectionOnly) { 657 if (!selectionOnly) {
658 paintForegroundForFragmentsWithPhase(PaintPhaseFloat, layerFragments, co ntext, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags, cl ipState); 658 paintForegroundForFragmentsWithPhase(PaintPhaseFloat, layerFragments, co ntext, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags, cl ipState);
659 paintForegroundForFragmentsWithPhase(PaintPhaseForeground, layerFragment s, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlag s, clipState); 659 paintForegroundForFragmentsWithPhase(PaintPhaseForeground, layerFragment s, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlag s, clipState);
660 paintForegroundForFragmentsWithPhase(PaintPhaseChildOutlines, layerFragm ents, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintF lags, clipState); 660 paintForegroundForFragmentsWithPhase(PaintPhaseChildOutlines, layerFragm ents, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintF lags, clipState);
661 } 661 }
662 } 662 }
663 663
664 void LayerPainter::paintForegroundForFragmentsWithPhase(PaintPhase phase, const LayerFragments& layerFragments, GraphicsContext* context, 664 void LayerPainter::paintForegroundForFragmentsWithPhase(PaintPhase phase, const LayerFragments& layerFragments, GraphicsContext* context,
665 const LayerPaintingInfo& localPaintingInfo, PaintBehavior paintBehavior, Ren derObject* paintingRootForRenderer, PaintLayerFlags paintFlags, ClipState clipSt ate) 665 const LayerPaintingInfo& localPaintingInfo, PaintBehavior paintBehavior, Lay outObject* paintingRootForRenderer, PaintLayerFlags paintFlags, ClipState clipSt ate)
666 { 666 {
667 for (const auto& fragment: layerFragments) { 667 for (const auto& fragment: layerFragments) {
668 if (!fragment.foregroundRect.isEmpty()) 668 if (!fragment.foregroundRect.isEmpty())
669 paintFragmentWithPhase(phase, fragment, context, fragment.foreground Rect, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags, cli pState); 669 paintFragmentWithPhase(phase, fragment, context, fragment.foreground Rect, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags, cli pState);
670 } 670 }
671 } 671 }
672 672
673 void LayerPainter::paintOutlineForFragments(const LayerFragments& layerFragments , GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo, 673 void LayerPainter::paintOutlineForFragments(const LayerFragments& layerFragments , GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo,
674 PaintBehavior paintBehavior, RenderObject* paintingRootForRenderer, PaintLay erFlags paintFlags) 674 PaintBehavior paintBehavior, LayoutObject* paintingRootForRenderer, PaintLay erFlags paintFlags)
675 { 675 {
676 for (const auto& fragment: layerFragments) { 676 for (const auto& fragment: layerFragments) {
677 if (!fragment.outlineRect.isEmpty()) 677 if (!fragment.outlineRect.isEmpty())
678 paintFragmentWithPhase(PaintPhaseSelfOutline, fragment, context, fra gment.outlineRect, localPaintingInfo, paintBehavior, paintingRootForRenderer, pa intFlags, HasNotClipped); 678 paintFragmentWithPhase(PaintPhaseSelfOutline, fragment, context, fra gment.outlineRect, localPaintingInfo, paintBehavior, paintingRootForRenderer, pa intFlags, HasNotClipped);
679 } 679 }
680 } 680 }
681 681
682 void LayerPainter::paintMaskForFragments(const LayerFragments& layerFragments, G raphicsContext* context, const LayerPaintingInfo& localPaintingInfo, 682 void LayerPainter::paintMaskForFragments(const LayerFragments& layerFragments, G raphicsContext* context, const LayerPaintingInfo& localPaintingInfo,
683 RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags) 683 LayoutObject* paintingRootForRenderer, PaintLayerFlags paintFlags)
684 { 684 {
685 for (const auto& fragment: layerFragments) 685 for (const auto& fragment: layerFragments)
686 paintFragmentWithPhase(PaintPhaseMask, fragment, context, fragment.backg roundRect, localPaintingInfo, PaintBehaviorNormal, paintingRootForRenderer, pain tFlags, HasNotClipped); 686 paintFragmentWithPhase(PaintPhaseMask, fragment, context, fragment.backg roundRect, localPaintingInfo, PaintBehaviorNormal, paintingRootForRenderer, pain tFlags, HasNotClipped);
687 } 687 }
688 688
689 void LayerPainter::paintChildClippingMaskForFragments(const LayerFragments& laye rFragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo , 689 void LayerPainter::paintChildClippingMaskForFragments(const LayerFragments& laye rFragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo ,
690 RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags) 690 LayoutObject* paintingRootForRenderer, PaintLayerFlags paintFlags)
691 { 691 {
692 for (const auto& fragment: layerFragments) 692 for (const auto& fragment: layerFragments)
693 paintFragmentWithPhase(PaintPhaseClippingMask, fragment, context, fragme nt.foregroundRect, localPaintingInfo, PaintBehaviorNormal, paintingRootForRender er, paintFlags, HasNotClipped); 693 paintFragmentWithPhase(PaintPhaseClippingMask, fragment, context, fragme nt.foregroundRect, localPaintingInfo, PaintBehaviorNormal, paintingRootForRender er, paintFlags, HasNotClipped);
694 } 694 }
695 695
696 void LayerPainter::paintOverlayScrollbars(GraphicsContext* context, const Layout Rect& damageRect, PaintBehavior paintBehavior, RenderObject* paintingRoot) 696 void LayerPainter::paintOverlayScrollbars(GraphicsContext* context, const Layout Rect& damageRect, PaintBehavior paintBehavior, LayoutObject* paintingRoot)
697 { 697 {
698 if (!m_renderLayer.containsDirtyOverlayScrollbars()) 698 if (!m_renderLayer.containsDirtyOverlayScrollbars())
699 return; 699 return;
700 700
701 LayerPaintingInfo paintingInfo(&m_renderLayer, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot); 701 LayerPaintingInfo paintingInfo(&m_renderLayer, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot);
702 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); 702 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars);
703 703
704 m_renderLayer.setContainsDirtyOverlayScrollbars(false); 704 m_renderLayer.setContainsDirtyOverlayScrollbars(false);
705 } 705 }
706 706
707 } // namespace blink 707 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/paint/LayerPainter.h ('k') | Source/core/paint/ListMarkerPainter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698