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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp

Issue 2380683006: SPv2: Add support for tracking raster paint invalidations in testing. (Closed)
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 /* 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 24 matching lines...) Expand all
35 #include "platform/geometry/LayoutRect.h" 35 #include "platform/geometry/LayoutRect.h"
36 #include "platform/geometry/Region.h" 36 #include "platform/geometry/Region.h"
37 #include "platform/graphics/BitmapImage.h" 37 #include "platform/graphics/BitmapImage.h"
38 #include "platform/graphics/CompositorFilterOperations.h" 38 #include "platform/graphics/CompositorFilterOperations.h"
39 #include "platform/graphics/FirstPaintInvalidationTracking.h" 39 #include "platform/graphics/FirstPaintInvalidationTracking.h"
40 #include "platform/graphics/GraphicsContext.h" 40 #include "platform/graphics/GraphicsContext.h"
41 #include "platform/graphics/Image.h" 41 #include "platform/graphics/Image.h"
42 #include "platform/graphics/LinkHighlight.h" 42 #include "platform/graphics/LinkHighlight.h"
43 #include "platform/graphics/paint/DrawingRecorder.h" 43 #include "platform/graphics/paint/DrawingRecorder.h"
44 #include "platform/graphics/paint/PaintController.h" 44 #include "platform/graphics/paint/PaintController.h"
45 #include "platform/graphics/paint/RasterInvalidationTracking.h"
45 #include "platform/json/JSONValues.h" 46 #include "platform/json/JSONValues.h"
46 #include "platform/scroll/ScrollableArea.h" 47 #include "platform/scroll/ScrollableArea.h"
47 #include "platform/text/TextStream.h" 48 #include "platform/text/TextStream.h"
48 #include "public/platform/Platform.h" 49 #include "public/platform/Platform.h"
49 #include "public/platform/WebCompositorSupport.h" 50 #include "public/platform/WebCompositorSupport.h"
50 #include "public/platform/WebFloatPoint.h" 51 #include "public/platform/WebFloatPoint.h"
51 #include "public/platform/WebFloatRect.h" 52 #include "public/platform/WebFloatRect.h"
52 #include "public/platform/WebLayer.h" 53 #include "public/platform/WebLayer.h"
53 #include "public/platform/WebPoint.h" 54 #include "public/platform/WebPoint.h"
54 #include "public/platform/WebSize.h" 55 #include "public/platform/WebSize.h"
55 #include "wtf/CurrentTime.h" 56 #include "wtf/CurrentTime.h"
56 #include "wtf/HashMap.h" 57 #include "wtf/HashMap.h"
57 #include "wtf/HashSet.h" 58 #include "wtf/HashSet.h"
58 #include "wtf/MathExtras.h" 59 #include "wtf/MathExtras.h"
59 #include "wtf/PtrUtil.h" 60 #include "wtf/PtrUtil.h"
60 #include "wtf/text/StringUTF8Adaptor.h" 61 #include "wtf/text/StringUTF8Adaptor.h"
61 #include "wtf/text/WTFString.h" 62 #include "wtf/text/WTFString.h"
62 #include <algorithm> 63 #include <algorithm>
63 #include <cmath> 64 #include <cmath>
64 #include <memory> 65 #include <memory>
65 #include <utility> 66 #include <utility>
66 67
67 #ifndef NDEBUG 68 #ifndef NDEBUG
68 #include <stdio.h> 69 #include <stdio.h>
69 #endif 70 #endif
70 71
71 namespace blink { 72 namespace blink {
72 73
73 struct PaintInvalidationInfo { 74 template class RasterInvalidationTrackingMap<const GraphicsLayer>;
74 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); 75 static RasterInvalidationTrackingMap<const GraphicsLayer>& rasterInvalidationTra ckingMap()
75 // This is for comparison only. Don't dereference because the client may hav e died.
76 const DisplayItemClient* client;
77 String clientDebugName;
78 IntRect rect;
79 PaintInvalidationReason reason;
80 };
81
82 struct UnderPaintInvalidation {
83 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
84 int x;
85 int y;
86 SkColor oldPixel;
87 SkColor newPixel;
88 };
89
90 struct PaintInvalidationTracking {
91 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
92 Vector<PaintInvalidationInfo> trackedPaintInvalidations;
93 sk_sp<SkPicture> lastPaintedPicture;
94 IntRect lastInterestRect;
95 Region paintInvalidationRegionSinceLastPaint;
96 Vector<UnderPaintInvalidation> underPaintInvalidations;
97 };
98
99 typedef HashMap<const GraphicsLayer*, PaintInvalidationTracking> PaintInvalidati onTrackingMap;
100 static PaintInvalidationTrackingMap& paintInvalidationTrackingMap()
101 { 76 {
102 DEFINE_STATIC_LOCAL(PaintInvalidationTrackingMap, map, ()); 77 DEFINE_STATIC_LOCAL(RasterInvalidationTrackingMap<const GraphicsLayer>, map, ());
103 return map; 78 return map;
104 } 79 }
105 80
106 std::unique_ptr<GraphicsLayer> GraphicsLayer::create(GraphicsLayerClient* client ) 81 std::unique_ptr<GraphicsLayer> GraphicsLayer::create(GraphicsLayerClient* client )
107 { 82 {
108 return wrapUnique(new GraphicsLayer(client)); 83 return wrapUnique(new GraphicsLayer(client));
109 } 84 }
110 85
111 GraphicsLayer::GraphicsLayer(GraphicsLayerClient* client) 86 GraphicsLayer::GraphicsLayer(GraphicsLayerClient* client)
112 : m_client(client) 87 : m_client(client)
113 , m_backgroundColor(Color::transparent) 88 , m_backgroundColor(Color::transparent)
114 , m_opacity(1) 89 , m_opacity(1)
115 , m_blendMode(WebBlendModeNormal) 90 , m_blendMode(WebBlendModeNormal)
116 , m_hasTransformOrigin(false) 91 , m_hasTransformOrigin(false)
117 , m_contentsOpaque(false) 92 , m_contentsOpaque(false)
118 , m_shouldFlattenTransform(true) 93 , m_shouldFlattenTransform(true)
119 , m_backfaceVisibility(true) 94 , m_backfaceVisibility(true)
120 , m_drawsContent(false) 95 , m_drawsContent(false)
121 , m_contentsVisible(true) 96 , m_contentsVisible(true)
122 , m_isRootForIsolatedGroup(false) 97 , m_isRootForIsolatedGroup(false)
123 , m_hasScrollParent(false) 98 , m_hasScrollParent(false)
124 , m_hasClipParent(false) 99 , m_hasClipParent(false)
125 , m_painted(false) 100 , m_painted(false)
126 , m_isTrackingPaintInvalidations(client && client->isTrackingPaintInvalidati ons()) 101 , m_isTrackingRasterInvalidations(client && client->isTrackingRasterInvalida tions())
127 , m_paintingPhase(GraphicsLayerPaintAllWithOverflowClip) 102 , m_paintingPhase(GraphicsLayerPaintAllWithOverflowClip)
128 , m_parent(0) 103 , m_parent(0)
129 , m_maskLayer(0) 104 , m_maskLayer(0)
130 , m_contentsClippingMaskLayer(0) 105 , m_contentsClippingMaskLayer(0)
131 , m_paintCount(0) 106 , m_paintCount(0)
132 , m_contentsLayer(0) 107 , m_contentsLayer(0)
133 , m_contentsLayerId(0) 108 , m_contentsLayerId(0)
134 , m_scrollableArea(nullptr) 109 , m_scrollableArea(nullptr)
135 , m_renderingContext3d(0) 110 , m_renderingContext3d(0)
136 { 111 {
(...skipping 15 matching lines...) Expand all
152 m_linkHighlights.clear(); 127 m_linkHighlights.clear();
153 128
154 #if ENABLE(ASSERT) 129 #if ENABLE(ASSERT)
155 if (m_client) 130 if (m_client)
156 m_client->verifyNotPainting(); 131 m_client->verifyNotPainting();
157 #endif 132 #endif
158 133
159 removeAllChildren(); 134 removeAllChildren();
160 removeFromParent(); 135 removeFromParent();
161 136
162 paintInvalidationTrackingMap().remove(this); 137 rasterInvalidationTrackingMap().remove(this);
163 ASSERT(!m_parent); 138 ASSERT(!m_parent);
164 } 139 }
165 140
166 LayoutRect GraphicsLayer::visualRect() const 141 LayoutRect GraphicsLayer::visualRect() const
167 { 142 {
168 LayoutRect bounds = LayoutRect(FloatPoint(), size()); 143 LayoutRect bounds = LayoutRect(FloatPoint(), size());
169 bounds.move(offsetFromLayoutObjectWithSubpixelAccumulation()); 144 bounds.move(offsetFromLayoutObjectWithSubpixelAccumulation());
170 return bounds; 145 return bounds;
171 } 146 }
172 147
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 return m_previousInterestRect; 277 return m_previousInterestRect;
303 } 278 }
304 279
305 void GraphicsLayer::paint(const IntRect* interestRect, GraphicsContext::Disabled Mode disabledMode) 280 void GraphicsLayer::paint(const IntRect* interestRect, GraphicsContext::Disabled Mode disabledMode)
306 { 281 {
307 if (paintWithoutCommit(interestRect, disabledMode)) { 282 if (paintWithoutCommit(interestRect, disabledMode)) {
308 getPaintController().commitNewDisplayItems(offsetFromLayoutObjectWithSub pixelAccumulation()); 283 getPaintController().commitNewDisplayItems(offsetFromLayoutObjectWithSub pixelAccumulation());
309 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { 284 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) {
310 sk_sp<SkPicture> newPicture = capturePicture(); 285 sk_sp<SkPicture> newPicture = capturePicture();
311 checkPaintUnderInvalidations(*newPicture); 286 checkPaintUnderInvalidations(*newPicture);
312 PaintInvalidationTracking& tracking = paintInvalidationTrackingMap() .add(this, PaintInvalidationTracking()).storedValue->value; 287 RasterInvalidationTracking& tracking = rasterInvalidationTrackingMap ().add(this);
313 tracking.lastPaintedPicture = std::move(newPicture); 288 tracking.lastPaintedPicture = std::move(newPicture);
314 tracking.lastInterestRect = m_previousInterestRect; 289 tracking.lastInterestRect = m_previousInterestRect;
315 tracking.paintInvalidationRegionSinceLastPaint = Region(); 290 tracking.rasterInvalidationRegionSinceLastPaint = Region();
316 } 291 }
317 } 292 }
318 } 293 }
319 294
320 bool GraphicsLayer::paintWithoutCommit(const IntRect* interestRect, GraphicsCont ext::DisabledMode disabledMode) 295 bool GraphicsLayer::paintWithoutCommit(const IntRect* interestRect, GraphicsCont ext::DisabledMode disabledMode)
321 { 296 {
322 ASSERT(drawsContent()); 297 ASSERT(drawsContent());
323 298
324 if (!m_client) 299 if (!m_client)
325 return false; 300 return false;
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 { 479 {
505 return m_debugInfo; 480 return m_debugInfo;
506 } 481 }
507 482
508 WebLayer* GraphicsLayer::contentsLayerIfRegistered() 483 WebLayer* GraphicsLayer::contentsLayerIfRegistered()
509 { 484 {
510 clearContentsLayerIfUnregistered(); 485 clearContentsLayerIfUnregistered();
511 return m_contentsLayer; 486 return m_contentsLayer;
512 } 487 }
513 488
514 void GraphicsLayer::setTracksPaintInvalidations(bool tracksPaintInvalidations) 489 void GraphicsLayer::setTracksRasterInvalidations(bool tracksRasterInvalidations)
515 { 490 {
516 resetTrackedPaintInvalidations(); 491 resetTrackedRasterInvalidations();
517 m_isTrackingPaintInvalidations = tracksPaintInvalidations; 492 m_isTrackingRasterInvalidations = tracksRasterInvalidations;
518 } 493 }
519 494
520 void GraphicsLayer::resetTrackedPaintInvalidations() 495 void GraphicsLayer::resetTrackedRasterInvalidations()
521 { 496 {
522 auto it = paintInvalidationTrackingMap().find(this); 497 RasterInvalidationTracking* tracking = rasterInvalidationTrackingMap().find( this);
523 if (it == paintInvalidationTrackingMap().end()) 498 if (!tracking)
524 return; 499 return;
525 500
526 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) 501 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled())
527 it->value.trackedPaintInvalidations.clear(); 502 tracking->trackedRasterInvalidations.clear();
528 else 503 else
529 paintInvalidationTrackingMap().remove(it); 504 rasterInvalidationTrackingMap().remove(this);
530 } 505 }
531 506
532 bool GraphicsLayer::hasTrackedPaintInvalidations() const 507 bool GraphicsLayer::hasTrackedRasterInvalidations() const
533 { 508 {
534 PaintInvalidationTrackingMap::iterator it = paintInvalidationTrackingMap().f ind(this); 509 RasterInvalidationTracking* tracking = rasterInvalidationTrackingMap().find( this);
535 if (it != paintInvalidationTrackingMap().end()) 510 if (tracking)
536 return !it->value.trackedPaintInvalidations.isEmpty(); 511 return !tracking->trackedRasterInvalidations.isEmpty();
537 return false; 512 return false;
538 } 513 }
539 514
540 void GraphicsLayer::trackPaintInvalidation(const DisplayItemClient& client, cons t IntRect& rect, PaintInvalidationReason reason) 515 void GraphicsLayer::trackRasterInvalidation(const DisplayItemClient& client, con st IntRect& rect, PaintInvalidationReason reason)
541 { 516 {
542 if (!isTrackingOrCheckingPaintInvalidations() || rect.isEmpty()) 517 if (!isTrackingOrCheckingRasterInvalidations() || rect.isEmpty())
543 return; 518 return;
544 519
545 PaintInvalidationTracking& tracking = paintInvalidationTrackingMap().add(thi s, PaintInvalidationTracking()).storedValue->value; 520 RasterInvalidationTracking& tracking = rasterInvalidationTrackingMap().add(t his);
546 521
547 if (m_isTrackingPaintInvalidations) { 522 if (m_isTrackingRasterInvalidations) {
548 PaintInvalidationInfo info = { &client, client.debugName(), rect, reason }; 523 RasterInvalidationInfo info;
549 tracking.trackedPaintInvalidations.append(info); 524 info.client = &client;
525 info.clientDebugName = client.debugName();
526 info.rect = rect;
527 info.reason = reason;
528 tracking.trackedRasterInvalidations.append(info);
550 } 529 }
551 530
552 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { 531 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) {
553 // TODO(crbug.com/496260): Some antialiasing effects overflows the paint invalidation rect. 532 // TODO(crbug.com/496260): Some antialiasing effects overflows the paint invalidation rect.
554 IntRect r = rect; 533 IntRect r = rect;
555 r.inflate(1); 534 r.inflate(1);
556 tracking.paintInvalidationRegionSinceLastPaint.unite(r); 535 tracking.rasterInvalidationRegionSinceLastPaint.unite(r);
557 } 536 }
558 } 537 }
559 538
560 static bool comparePaintInvalidationInfo(const PaintInvalidationInfo& a, const P aintInvalidationInfo& b)
561 {
562 // Sort by rect first, bigger rects before smaller ones.
563 if (a.rect.width() != b.rect.width())
564 return a.rect.width() > b.rect.width();
565 if (a.rect.height() != b.rect.height())
566 return a.rect.height() > b.rect.height();
567 if (a.rect.x() != b.rect.x())
568 return a.rect.x() > b.rect.x();
569 if (a.rect.y() != b.rect.y())
570 return a.rect.y() > b.rect.y();
571
572 // Then compare clientDebugName, in alphabetic order.
573 int nameCompareResult = codePointCompare(a.clientDebugName, b.clientDebugNam e);
574 if (nameCompareResult != 0)
575 return nameCompareResult < 0;
576
577 return a.reason < b.reason;
578 }
579
580 template <typename T> 539 template <typename T>
581 static std::unique_ptr<JSONArray> pointAsJSONArray(const T& point) 540 static std::unique_ptr<JSONArray> pointAsJSONArray(const T& point)
582 { 541 {
583 std::unique_ptr<JSONArray> array = JSONArray::create(); 542 std::unique_ptr<JSONArray> array = JSONArray::create();
584 array->pushDouble(point.x()); 543 array->pushDouble(point.x());
585 array->pushDouble(point.y()); 544 array->pushDouble(point.y());
586 return array; 545 return array;
587 } 546 }
588 547
589 template <typename T> 548 template <typename T>
590 static std::unique_ptr<JSONArray> sizeAsJSONArray(const T& size) 549 static std::unique_ptr<JSONArray> sizeAsJSONArray(const T& size)
591 { 550 {
592 std::unique_ptr<JSONArray> array = JSONArray::create(); 551 std::unique_ptr<JSONArray> array = JSONArray::create();
593 array->pushDouble(size.width()); 552 array->pushDouble(size.width());
594 array->pushDouble(size.height()); 553 array->pushDouble(size.height());
595 return array; 554 return array;
596 } 555 }
597 556
598 template <typename T>
599 static std::unique_ptr<JSONArray> rectAsJSONArray(const T& rect)
600 {
601 std::unique_ptr<JSONArray> array = JSONArray::create();
602 array->pushDouble(rect.x());
603 array->pushDouble(rect.y());
604 array->pushDouble(rect.width());
605 array->pushDouble(rect.height());
606 return array;
607 }
608
609 static double roundCloseToZero(double number) 557 static double roundCloseToZero(double number)
610 { 558 {
611 return std::abs(number) < 1e-7 ? 0 : number; 559 return std::abs(number) < 1e-7 ? 0 : number;
612 } 560 }
613 561
614 static std::unique_ptr<JSONArray> transformAsJSONArray(const TransformationMatri x& t) 562 static std::unique_ptr<JSONArray> transformAsJSONArray(const TransformationMatri x& t)
615 { 563 {
616 std::unique_ptr<JSONArray> array = JSONArray::create(); 564 std::unique_ptr<JSONArray> array = JSONArray::create();
617 { 565 {
618 std::unique_ptr<JSONArray> row = JSONArray::create(); 566 std::unique_ptr<JSONArray> row = JSONArray::create();
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 665
718 if (flags & LayerTreeIncludesDebugInfo) 666 if (flags & LayerTreeIncludesDebugInfo)
719 json->setString("client", pointerAsString(m_client)); 667 json->setString("client", pointerAsString(m_client));
720 668
721 if (m_backgroundColor.alpha()) 669 if (m_backgroundColor.alpha())
722 json->setString("backgroundColor", m_backgroundColor.nameForLayoutTreeAs Text()); 670 json->setString("backgroundColor", m_backgroundColor.nameForLayoutTreeAs Text());
723 671
724 if (!m_transform.isIdentity()) 672 if (!m_transform.isIdentity())
725 json->setArray("transform", transformAsJSONArray(m_transform)); 673 json->setArray("transform", transformAsJSONArray(m_transform));
726 674
727 PaintInvalidationTrackingMap::iterator it = paintInvalidationTrackingMap().f ind(this); 675 rasterInvalidationTrackingMap().asJSON(this, json.get());
728 if (it != paintInvalidationTrackingMap().end()) {
729 if (flags & LayerTreeIncludesPaintInvalidations) {
730 Vector<PaintInvalidationInfo>& infos = it->value.trackedPaintInvalid ations;
731 if (!infos.isEmpty()) {
732 std::sort(infos.begin(), infos.end(), &comparePaintInvalidationI nfo);
733 std::unique_ptr<JSONArray> paintInvalidationsJSON = JSONArray::c reate();
734 for (auto& info : infos) {
735 std::unique_ptr<JSONObject> infoJSON = JSONObject::create();
736 infoJSON->setString("object", info.clientDebugName);
737 if (!info.rect.isEmpty())
738 infoJSON->setArray("rect", rectAsJSONArray(info.rect));
739 infoJSON->setString("reason", paintInvalidationReasonToStrin g(info.reason));
740 paintInvalidationsJSON->pushObject(std::move(infoJSON));
741 }
742 json->setArray("paintInvalidations", std::move(paintInvalidation sJSON));
743 }
744
745 Vector<UnderPaintInvalidation>& underPaintInvalidations = it->value. underPaintInvalidations;
746 if (!underPaintInvalidations.isEmpty()) {
747 std::unique_ptr<JSONArray> underPaintInvalidationsJSON = JSONArr ay::create();
748 for (auto& underPaintInvalidation : underPaintInvalidations) {
749 std::unique_ptr<JSONObject> underPaintInvalidationJSON = JSO NObject::create();
750 underPaintInvalidationJSON->setDouble("x", underPaintInvalid ation.x);
751 underPaintInvalidationJSON->setDouble("y", underPaintInvalid ation.y);
752 underPaintInvalidationJSON->setString("oldPixel", Color(unde rPaintInvalidation.oldPixel).nameForLayoutTreeAsText());
753 underPaintInvalidationJSON->setString("newPixel", Color(unde rPaintInvalidation.newPixel).nameForLayoutTreeAsText());
754 underPaintInvalidationsJSON->pushObject(std::move(underPaint InvalidationJSON));
755 }
756 json->setArray("underPaintInvalidations", std::move(underPaintIn validationsJSON));
757 }
758 }
759 }
760 676
761 if ((flags & LayerTreeIncludesPaintingPhases) && m_paintingPhase) { 677 if ((flags & LayerTreeIncludesPaintingPhases) && m_paintingPhase) {
762 std::unique_ptr<JSONArray> paintingPhasesJSON = JSONArray::create(); 678 std::unique_ptr<JSONArray> paintingPhasesJSON = JSONArray::create();
763 if (m_paintingPhase & GraphicsLayerPaintBackground) 679 if (m_paintingPhase & GraphicsLayerPaintBackground)
764 paintingPhasesJSON->pushString("GraphicsLayerPaintBackground"); 680 paintingPhasesJSON->pushString("GraphicsLayerPaintBackground");
765 if (m_paintingPhase & GraphicsLayerPaintForeground) 681 if (m_paintingPhase & GraphicsLayerPaintForeground)
766 paintingPhasesJSON->pushString("GraphicsLayerPaintForeground"); 682 paintingPhasesJSON->pushString("GraphicsLayerPaintForeground");
767 if (m_paintingPhase & GraphicsLayerPaintMask) 683 if (m_paintingPhase & GraphicsLayerPaintMask)
768 paintingPhasesJSON->pushString("GraphicsLayerPaintMask"); 684 paintingPhasesJSON->pushString("GraphicsLayerPaintMask");
769 if (m_paintingPhase & GraphicsLayerPaintChildClippingMask) 685 if (m_paintingPhase & GraphicsLayerPaintChildClippingMask)
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1034 if (m_isRootForIsolatedGroup == isolated) 950 if (m_isRootForIsolatedGroup == isolated)
1035 return; 951 return;
1036 m_isRootForIsolatedGroup = isolated; 952 m_isRootForIsolatedGroup = isolated;
1037 platformLayer()->setIsRootForIsolatedGroup(isolated); 953 platformLayer()->setIsRootForIsolatedGroup(isolated);
1038 } 954 }
1039 955
1040 void GraphicsLayer::setContentsNeedsDisplay() 956 void GraphicsLayer::setContentsNeedsDisplay()
1041 { 957 {
1042 if (WebLayer* contentsLayer = contentsLayerIfRegistered()) { 958 if (WebLayer* contentsLayer = contentsLayerIfRegistered()) {
1043 contentsLayer->invalidate(); 959 contentsLayer->invalidate();
1044 trackPaintInvalidation(*this, m_contentsRect, PaintInvalidationFull); 960 trackRasterInvalidation(*this, m_contentsRect, PaintInvalidationFull);
1045 } 961 }
1046 } 962 }
1047 963
1048 void GraphicsLayer::setNeedsDisplay() 964 void GraphicsLayer::setNeedsDisplay()
1049 { 965 {
1050 if (!drawsContent()) 966 if (!drawsContent())
1051 return; 967 return;
1052 968
1053 // TODO(chrishtr): stop invalidating the rects once FrameView::paintRecursiv ely does so. 969 // TODO(chrishtr): stop invalidating the rects once FrameView::paintRecursiv ely does so.
1054 m_layer->layer()->invalidate(); 970 m_layer->layer()->invalidate();
1055 for (size_t i = 0; i < m_linkHighlights.size(); ++i) 971 for (size_t i = 0; i < m_linkHighlights.size(); ++i)
1056 m_linkHighlights[i]->invalidate(); 972 m_linkHighlights[i]->invalidate();
1057 getPaintController().invalidateAll(); 973 getPaintController().invalidateAll();
1058 974
1059 trackPaintInvalidation(*this, IntRect(IntPoint(), expandedIntSize(m_size)), PaintInvalidationFull); 975 trackRasterInvalidation(*this, IntRect(IntPoint(), expandedIntSize(m_size)), PaintInvalidationFull);
1060 } 976 }
1061 977
1062 void GraphicsLayer::setNeedsDisplayInRect(const IntRect& rect, PaintInvalidation Reason invalidationReason, const DisplayItemClient& client) 978 void GraphicsLayer::setNeedsDisplayInRect(const IntRect& rect, PaintInvalidation Reason invalidationReason, const DisplayItemClient& client)
1063 { 979 {
1064 if (!drawsContent()) 980 if (!drawsContent())
1065 return; 981 return;
1066 982
1067 m_layer->layer()->invalidateRect(rect); 983 m_layer->layer()->invalidateRect(rect);
1068 if (firstPaintInvalidationTrackingEnabled()) 984 if (firstPaintInvalidationTrackingEnabled())
1069 m_debugInfo.appendAnnotatedInvalidateRect(rect, invalidationReason); 985 m_debugInfo.appendAnnotatedInvalidateRect(rect, invalidationReason);
1070 for (size_t i = 0; i < m_linkHighlights.size(); ++i) 986 for (size_t i = 0; i < m_linkHighlights.size(); ++i)
1071 m_linkHighlights[i]->invalidate(); 987 m_linkHighlights[i]->invalidate();
1072 988
1073 trackPaintInvalidation(client, rect, invalidationReason); 989 trackRasterInvalidation(client, rect, invalidationReason);
1074 } 990 }
1075 991
1076 void GraphicsLayer::setContentsRect(const IntRect& rect) 992 void GraphicsLayer::setContentsRect(const IntRect& rect)
1077 { 993 {
1078 if (rect == m_contentsRect) 994 if (rect == m_contentsRect)
1079 return; 995 return;
1080 996
1081 m_contentsRect = rect; 997 m_contentsRect = rect;
1082 updateContentsRect(); 998 updateContentsRect();
1083 } 999 }
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
1245 || pixelComponentsDiffer(SkColorGetR(p1), SkColorGetR(p2)) 1161 || pixelComponentsDiffer(SkColorGetR(p1), SkColorGetR(p2))
1246 || pixelComponentsDiffer(SkColorGetG(p1), SkColorGetG(p2)) 1162 || pixelComponentsDiffer(SkColorGetG(p1), SkColorGetG(p2))
1247 || pixelComponentsDiffer(SkColorGetB(p1), SkColorGetB(p2)); 1163 || pixelComponentsDiffer(SkColorGetB(p1), SkColorGetB(p2));
1248 } 1164 }
1249 1165
1250 void GraphicsLayer::checkPaintUnderInvalidations(const SkPicture& newPicture) 1166 void GraphicsLayer::checkPaintUnderInvalidations(const SkPicture& newPicture)
1251 { 1167 {
1252 if (!drawsContent()) 1168 if (!drawsContent())
1253 return; 1169 return;
1254 1170
1255 auto it = paintInvalidationTrackingMap().find(this); 1171 RasterInvalidationTracking* tracking = rasterInvalidationTrackingMap().find( this);
1256 if (it == paintInvalidationTrackingMap().end()) 1172 if (!tracking)
1257 return;
1258 PaintInvalidationTracking& tracking = it->value;
1259 if (!tracking.lastPaintedPicture)
1260 return; 1173 return;
1261 1174
1262 IntRect rect = intersection(tracking.lastInterestRect, interestRect()); 1175 if (!tracking->lastPaintedPicture)
1176 return;
1177
1178 IntRect rect = intersection(tracking->lastInterestRect, interestRect());
1263 if (rect.isEmpty()) 1179 if (rect.isEmpty())
1264 return; 1180 return;
1265 1181
1266 SkBitmap oldBitmap; 1182 SkBitmap oldBitmap;
1267 oldBitmap.allocPixels(SkImageInfo::MakeN32Premul(rect.width(), rect.height() )); 1183 oldBitmap.allocPixels(SkImageInfo::MakeN32Premul(rect.width(), rect.height() ));
1268 { 1184 {
1269 SkCanvas canvas(oldBitmap); 1185 SkCanvas canvas(oldBitmap);
1270 canvas.clear(SK_ColorTRANSPARENT); 1186 canvas.clear(SK_ColorTRANSPARENT);
1271 canvas.translate(-rect.x(), -rect.y()); 1187 canvas.translate(-rect.x(), -rect.y());
1272 canvas.drawPicture(tracking.lastPaintedPicture.get()); 1188 canvas.drawPicture(tracking->lastPaintedPicture.get());
1273 } 1189 }
1274 1190
1275 SkBitmap newBitmap; 1191 SkBitmap newBitmap;
1276 newBitmap.allocPixels(SkImageInfo::MakeN32Premul(rect.width(), rect.height() )); 1192 newBitmap.allocPixels(SkImageInfo::MakeN32Premul(rect.width(), rect.height() ));
1277 { 1193 {
1278 SkCanvas canvas(newBitmap); 1194 SkCanvas canvas(newBitmap);
1279 canvas.clear(SK_ColorTRANSPARENT); 1195 canvas.clear(SK_ColorTRANSPARENT);
1280 canvas.translate(-rect.x(), -rect.y()); 1196 canvas.translate(-rect.x(), -rect.y());
1281 canvas.drawPicture(&newPicture); 1197 canvas.drawPicture(&newPicture);
1282 } 1198 }
1283 1199
1284 oldBitmap.lockPixels(); 1200 oldBitmap.lockPixels();
1285 newBitmap.lockPixels(); 1201 newBitmap.lockPixels();
1286 int mismatchingPixels = 0; 1202 int mismatchingPixels = 0;
1287 static const int maxMismatchesToReport = 50; 1203 static const int maxMismatchesToReport = 50;
1288 for (int bitmapY = 0; bitmapY < rect.height(); ++bitmapY) { 1204 for (int bitmapY = 0; bitmapY < rect.height(); ++bitmapY) {
1289 int layerY = bitmapY + rect.y(); 1205 int layerY = bitmapY + rect.y();
1290 for (int bitmapX = 0; bitmapX < rect.width(); ++bitmapX) { 1206 for (int bitmapX = 0; bitmapX < rect.width(); ++bitmapX) {
1291 int layerX = bitmapX + rect.x(); 1207 int layerX = bitmapX + rect.x();
1292 SkColor oldPixel = oldBitmap.getColor(bitmapX, bitmapY); 1208 SkColor oldPixel = oldBitmap.getColor(bitmapX, bitmapY);
1293 SkColor newPixel = newBitmap.getColor(bitmapX, bitmapY); 1209 SkColor newPixel = newBitmap.getColor(bitmapX, bitmapY);
1294 if (pixelsDiffer(oldPixel, newPixel) && !tracking.paintInvalidationR egionSinceLastPaint.contains(IntPoint(layerX, layerY))) { 1210 if (pixelsDiffer(oldPixel, newPixel) && !tracking->rasterInvalidatio nRegionSinceLastPaint.contains(IntPoint(layerX, layerY))) {
1295 if (mismatchingPixels < maxMismatchesToReport) { 1211 if (mismatchingPixels < maxMismatchesToReport) {
1296 UnderPaintInvalidation underPaintInvalidation = { layerX, la yerY, oldPixel, newPixel }; 1212 UnderPaintInvalidation underPaintInvalidation = { layerX, la yerY, oldPixel, newPixel };
1297 tracking.underPaintInvalidations.append(underPaintInvalidati on); 1213 tracking->underPaintInvalidations.append(underPaintInvalidat ion);
1298 LOG(ERROR) << debugName() << " Uninvalidated old/new pixels mismatch at " << layerX << "," << layerY << " old:" << std::hex << oldPixel << " new:" << newPixel; 1214 LOG(ERROR) << debugName() << " Uninvalidated old/new pixels mismatch at " << layerX << "," << layerY << " old:" << std::hex << oldPixel << " new:" << newPixel;
1299 } else if (mismatchingPixels == maxMismatchesToReport) { 1215 } else if (mismatchingPixels == maxMismatchesToReport) {
1300 LOG(ERROR) << "and more..."; 1216 LOG(ERROR) << "and more...";
1301 } 1217 }
1302 ++mismatchingPixels; 1218 ++mismatchingPixels;
1303 *newBitmap.getAddr32(bitmapX, bitmapY) = SkColorSetARGB(0xFF, 0x A0, 0, 0); // Dark red. 1219 *newBitmap.getAddr32(bitmapX, bitmapY) = SkColorSetARGB(0xFF, 0x A0, 0, 0); // Dark red.
1304 } else { 1220 } else {
1305 *newBitmap.getAddr32(bitmapX, bitmapY) = SK_ColorTRANSPARENT; 1221 *newBitmap.getAddr32(bitmapX, bitmapY) = SK_ColorTRANSPARENT;
1306 } 1222 }
1307 } 1223 }
(...skipping 17 matching lines...) Expand all
1325 { 1241 {
1326 if (!layer) { 1242 if (!layer) {
1327 fprintf(stderr, "Cannot showGraphicsLayerTree for (nil).\n"); 1243 fprintf(stderr, "Cannot showGraphicsLayerTree for (nil).\n");
1328 return; 1244 return;
1329 } 1245 }
1330 1246
1331 String output = layer->layerTreeAsText(blink::LayerTreeIncludesDebugInfo); 1247 String output = layer->layerTreeAsText(blink::LayerTreeIncludesDebugInfo);
1332 fprintf(stderr, "%s\n", output.utf8().data()); 1248 fprintf(stderr, "%s\n", output.utf8().data());
1333 } 1249 }
1334 #endif 1250 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698