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

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>&
75 // This is for comparison only. Don't dereference because the client may have died. 76 rasterInvalidationTrackingMap() {
76 const DisplayItemClient* client; 77 DEFINE_STATIC_LOCAL(RasterInvalidationTrackingMap<const GraphicsLayer>, map,
77 String clientDebugName; 78 ());
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>
100 PaintInvalidationTrackingMap;
101 static PaintInvalidationTrackingMap& paintInvalidationTrackingMap() {
102 DEFINE_STATIC_LOCAL(PaintInvalidationTrackingMap, map, ());
103 return map; 79 return map;
104 } 80 }
105 81
106 std::unique_ptr<GraphicsLayer> GraphicsLayer::create( 82 std::unique_ptr<GraphicsLayer> GraphicsLayer::create(
107 GraphicsLayerClient* client) { 83 GraphicsLayerClient* client) {
108 return wrapUnique(new GraphicsLayer(client)); 84 return wrapUnique(new GraphicsLayer(client));
109 } 85 }
110 86
111 GraphicsLayer::GraphicsLayer(GraphicsLayerClient* client) 87 GraphicsLayer::GraphicsLayer(GraphicsLayerClient* client)
112 : m_client(client), 88 : m_client(client),
113 m_backgroundColor(Color::transparent), 89 m_backgroundColor(Color::transparent),
114 m_opacity(1), 90 m_opacity(1),
115 m_blendMode(WebBlendModeNormal), 91 m_blendMode(WebBlendModeNormal),
116 m_hasTransformOrigin(false), 92 m_hasTransformOrigin(false),
117 m_contentsOpaque(false), 93 m_contentsOpaque(false),
118 m_shouldFlattenTransform(true), 94 m_shouldFlattenTransform(true),
119 m_backfaceVisibility(true), 95 m_backfaceVisibility(true),
120 m_drawsContent(false), 96 m_drawsContent(false),
121 m_contentsVisible(true), 97 m_contentsVisible(true),
122 m_isRootForIsolatedGroup(false), 98 m_isRootForIsolatedGroup(false),
123 m_hasScrollParent(false), 99 m_hasScrollParent(false),
124 m_hasClipParent(false), 100 m_hasClipParent(false),
125 m_painted(false), 101 m_painted(false),
126 m_isTrackingPaintInvalidations(client && 102 m_isTrackingRasterInvalidations(client &&
127 client->isTrackingPaintInvalidations()), 103 client->isTrackingRasterInvalidations()),
128 m_paintingPhase(GraphicsLayerPaintAllWithOverflowClip), 104 m_paintingPhase(GraphicsLayerPaintAllWithOverflowClip),
129 m_parent(0), 105 m_parent(0),
130 m_maskLayer(0), 106 m_maskLayer(0),
131 m_contentsClippingMaskLayer(0), 107 m_contentsClippingMaskLayer(0),
132 m_paintCount(0), 108 m_paintCount(0),
133 m_contentsLayer(0), 109 m_contentsLayer(0),
134 m_contentsLayerId(0), 110 m_contentsLayerId(0),
135 m_scrollableArea(nullptr), 111 m_scrollableArea(nullptr),
136 m_renderingContext3d(0) { 112 m_renderingContext3d(0) {
137 #if ENABLE(ASSERT) 113 #if ENABLE(ASSERT)
(...skipping 15 matching lines...) Expand all
153 m_linkHighlights.clear(); 129 m_linkHighlights.clear();
154 130
155 #if ENABLE(ASSERT) 131 #if ENABLE(ASSERT)
156 if (m_client) 132 if (m_client)
157 m_client->verifyNotPainting(); 133 m_client->verifyNotPainting();
158 #endif 134 #endif
159 135
160 removeAllChildren(); 136 removeAllChildren();
161 removeFromParent(); 137 removeFromParent();
162 138
163 paintInvalidationTrackingMap().remove(this); 139 rasterInvalidationTrackingMap().remove(this);
164 ASSERT(!m_parent); 140 ASSERT(!m_parent);
165 } 141 }
166 142
167 LayoutRect GraphicsLayer::visualRect() const { 143 LayoutRect GraphicsLayer::visualRect() const {
168 LayoutRect bounds = LayoutRect(FloatPoint(), size()); 144 LayoutRect bounds = LayoutRect(FloatPoint(), size());
169 bounds.move(offsetFromLayoutObjectWithSubpixelAccumulation()); 145 bounds.move(offsetFromLayoutObjectWithSubpixelAccumulation());
170 return bounds; 146 return bounds;
171 } 147 }
172 148
173 void GraphicsLayer::setHasWillChangeTransformHint(bool hasWillChangeTransform) { 149 void GraphicsLayer::setHasWillChangeTransformHint(bool hasWillChangeTransform) {
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 } 273 }
298 274
299 void GraphicsLayer::paint(const IntRect* interestRect, 275 void GraphicsLayer::paint(const IntRect* interestRect,
300 GraphicsContext::DisabledMode disabledMode) { 276 GraphicsContext::DisabledMode disabledMode) {
301 if (paintWithoutCommit(interestRect, disabledMode)) { 277 if (paintWithoutCommit(interestRect, disabledMode)) {
302 getPaintController().commitNewDisplayItems( 278 getPaintController().commitNewDisplayItems(
303 offsetFromLayoutObjectWithSubpixelAccumulation()); 279 offsetFromLayoutObjectWithSubpixelAccumulation());
304 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { 280 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) {
305 sk_sp<SkPicture> newPicture = capturePicture(); 281 sk_sp<SkPicture> newPicture = capturePicture();
306 checkPaintUnderInvalidations(*newPicture); 282 checkPaintUnderInvalidations(*newPicture);
307 PaintInvalidationTracking& tracking = 283 RasterInvalidationTracking& tracking =
308 paintInvalidationTrackingMap() 284 rasterInvalidationTrackingMap().add(this);
309 .add(this, PaintInvalidationTracking())
310 .storedValue->value;
311 tracking.lastPaintedPicture = std::move(newPicture); 285 tracking.lastPaintedPicture = std::move(newPicture);
312 tracking.lastInterestRect = m_previousInterestRect; 286 tracking.lastInterestRect = m_previousInterestRect;
313 tracking.paintInvalidationRegionSinceLastPaint = Region(); 287 tracking.rasterInvalidationRegionSinceLastPaint = Region();
314 } 288 }
315 } 289 }
316 } 290 }
317 291
318 bool GraphicsLayer::paintWithoutCommit( 292 bool GraphicsLayer::paintWithoutCommit(
319 const IntRect* interestRect, 293 const IntRect* interestRect,
320 GraphicsContext::DisabledMode disabledMode) { 294 GraphicsContext::DisabledMode disabledMode) {
321 ASSERT(drawsContent()); 295 ASSERT(drawsContent());
322 296
323 if (!m_client) 297 if (!m_client)
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 475
502 GraphicsLayerDebugInfo& GraphicsLayer::debugInfo() { 476 GraphicsLayerDebugInfo& GraphicsLayer::debugInfo() {
503 return m_debugInfo; 477 return m_debugInfo;
504 } 478 }
505 479
506 WebLayer* GraphicsLayer::contentsLayerIfRegistered() { 480 WebLayer* GraphicsLayer::contentsLayerIfRegistered() {
507 clearContentsLayerIfUnregistered(); 481 clearContentsLayerIfUnregistered();
508 return m_contentsLayer; 482 return m_contentsLayer;
509 } 483 }
510 484
511 void GraphicsLayer::setTracksPaintInvalidations(bool tracksPaintInvalidations) { 485 void GraphicsLayer::setTracksRasterInvalidations(
512 resetTrackedPaintInvalidations(); 486 bool tracksRasterInvalidations) {
513 m_isTrackingPaintInvalidations = tracksPaintInvalidations; 487 resetTrackedRasterInvalidations();
488 m_isTrackingRasterInvalidations = tracksRasterInvalidations;
514 } 489 }
515 490
516 void GraphicsLayer::resetTrackedPaintInvalidations() { 491 void GraphicsLayer::resetTrackedRasterInvalidations() {
517 auto it = paintInvalidationTrackingMap().find(this); 492 RasterInvalidationTracking* tracking =
518 if (it == paintInvalidationTrackingMap().end()) 493 rasterInvalidationTrackingMap().find(this);
494 if (!tracking)
519 return; 495 return;
520 496
521 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) 497 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled())
522 it->value.trackedPaintInvalidations.clear(); 498 tracking->trackedRasterInvalidations.clear();
523 else 499 else
524 paintInvalidationTrackingMap().remove(it); 500 rasterInvalidationTrackingMap().remove(this);
525 } 501 }
526 502
527 bool GraphicsLayer::hasTrackedPaintInvalidations() const { 503 bool GraphicsLayer::hasTrackedRasterInvalidations() const {
528 PaintInvalidationTrackingMap::iterator it = 504 RasterInvalidationTracking* tracking =
529 paintInvalidationTrackingMap().find(this); 505 rasterInvalidationTrackingMap().find(this);
530 if (it != paintInvalidationTrackingMap().end()) 506 if (tracking)
531 return !it->value.trackedPaintInvalidations.isEmpty(); 507 return !tracking->trackedRasterInvalidations.isEmpty();
532 return false; 508 return false;
533 } 509 }
534 510
535 void GraphicsLayer::trackPaintInvalidation(const DisplayItemClient& client, 511 void GraphicsLayer::trackRasterInvalidation(const DisplayItemClient& client,
536 const IntRect& rect, 512 const IntRect& rect,
537 PaintInvalidationReason reason) { 513 PaintInvalidationReason reason) {
538 if (!isTrackingOrCheckingPaintInvalidations() || rect.isEmpty()) 514 if (!isTrackingOrCheckingRasterInvalidations() || rect.isEmpty())
539 return; 515 return;
540 516
541 PaintInvalidationTracking& tracking = 517 RasterInvalidationTracking& tracking =
542 paintInvalidationTrackingMap() 518 rasterInvalidationTrackingMap().add(this);
543 .add(this, PaintInvalidationTracking())
544 .storedValue->value;
545 519
546 if (m_isTrackingPaintInvalidations) { 520 if (m_isTrackingRasterInvalidations) {
547 PaintInvalidationInfo info = {&client, client.debugName(), rect, reason}; 521 RasterInvalidationInfo info;
548 tracking.trackedPaintInvalidations.append(info); 522 info.client = &client;
523 info.clientDebugName = client.debugName();
524 info.rect = rect;
525 info.reason = reason;
526 tracking.trackedRasterInvalidations.append(info);
549 } 527 }
550 528
551 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { 529 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) {
552 // TODO(crbug.com/496260): Some antialiasing effects overflows the paint inv alidation rect. 530 // TODO(crbug.com/496260): Some antialiasing effects overflows the paint inv alidation rect.
553 IntRect r = rect; 531 IntRect r = rect;
554 r.inflate(1); 532 r.inflate(1);
555 tracking.paintInvalidationRegionSinceLastPaint.unite(r); 533 tracking.rasterInvalidationRegionSinceLastPaint.unite(r);
556 } 534 }
557 } 535 }
558 536
559 static bool comparePaintInvalidationInfo(const PaintInvalidationInfo& a,
560 const PaintInvalidationInfo& b) {
561 // Sort by rect first, bigger rects before smaller ones.
562 if (a.rect.width() != b.rect.width())
563 return a.rect.width() > b.rect.width();
564 if (a.rect.height() != b.rect.height())
565 return a.rect.height() > b.rect.height();
566 if (a.rect.x() != b.rect.x())
567 return a.rect.x() > b.rect.x();
568 if (a.rect.y() != b.rect.y())
569 return a.rect.y() > b.rect.y();
570
571 // Then compare clientDebugName, in alphabetic order.
572 int nameCompareResult =
573 codePointCompare(a.clientDebugName, b.clientDebugName);
574 if (nameCompareResult != 0)
575 return nameCompareResult < 0;
576
577 return a.reason < b.reason;
578 }
579
580 template <typename T> 537 template <typename T>
581 static std::unique_ptr<JSONArray> pointAsJSONArray(const T& point) { 538 static std::unique_ptr<JSONArray> pointAsJSONArray(const T& point) {
582 std::unique_ptr<JSONArray> array = JSONArray::create(); 539 std::unique_ptr<JSONArray> array = JSONArray::create();
583 array->pushDouble(point.x()); 540 array->pushDouble(point.x());
584 array->pushDouble(point.y()); 541 array->pushDouble(point.y());
585 return array; 542 return array;
586 } 543 }
587 544
588 template <typename T> 545 template <typename T>
589 static std::unique_ptr<JSONArray> sizeAsJSONArray(const T& size) { 546 static std::unique_ptr<JSONArray> sizeAsJSONArray(const T& size) {
590 std::unique_ptr<JSONArray> array = JSONArray::create(); 547 std::unique_ptr<JSONArray> array = JSONArray::create();
591 array->pushDouble(size.width()); 548 array->pushDouble(size.width());
592 array->pushDouble(size.height()); 549 array->pushDouble(size.height());
593 return array; 550 return array;
594 } 551 }
595 552
596 template <typename T>
597 static std::unique_ptr<JSONArray> rectAsJSONArray(const T& rect) {
598 std::unique_ptr<JSONArray> array = JSONArray::create();
599 array->pushDouble(rect.x());
600 array->pushDouble(rect.y());
601 array->pushDouble(rect.width());
602 array->pushDouble(rect.height());
603 return array;
604 }
605
606 static double roundCloseToZero(double number) { 553 static double roundCloseToZero(double number) {
607 return std::abs(number) < 1e-7 ? 0 : number; 554 return std::abs(number) < 1e-7 ? 0 : number;
608 } 555 }
609 556
610 static std::unique_ptr<JSONArray> transformAsJSONArray( 557 static std::unique_ptr<JSONArray> transformAsJSONArray(
611 const TransformationMatrix& t) { 558 const TransformationMatrix& t) {
612 std::unique_ptr<JSONArray> array = JSONArray::create(); 559 std::unique_ptr<JSONArray> array = JSONArray::create();
613 { 560 {
614 std::unique_ptr<JSONArray> row = JSONArray::create(); 561 std::unique_ptr<JSONArray> row = JSONArray::create();
615 row->pushDouble(roundCloseToZero(t.m11())); 562 row->pushDouble(roundCloseToZero(t.m11()));
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 if (flags & LayerTreeIncludesDebugInfo) 666 if (flags & LayerTreeIncludesDebugInfo)
720 json->setString("client", pointerAsString(m_client)); 667 json->setString("client", pointerAsString(m_client));
721 668
722 if (m_backgroundColor.alpha()) 669 if (m_backgroundColor.alpha())
723 json->setString("backgroundColor", 670 json->setString("backgroundColor",
724 m_backgroundColor.nameForLayoutTreeAsText()); 671 m_backgroundColor.nameForLayoutTreeAsText());
725 672
726 if (!m_transform.isIdentity()) 673 if (!m_transform.isIdentity())
727 json->setArray("transform", transformAsJSONArray(m_transform)); 674 json->setArray("transform", transformAsJSONArray(m_transform));
728 675
729 PaintInvalidationTrackingMap::iterator it = 676 if (flags & LayerTreeIncludesPaintInvalidations)
730 paintInvalidationTrackingMap().find(this); 677 rasterInvalidationTrackingMap().asJSON(this, json.get());
731 if (it != paintInvalidationTrackingMap().end()) {
732 if (flags & LayerTreeIncludesPaintInvalidations) {
733 Vector<PaintInvalidationInfo>& infos =
734 it->value.trackedPaintInvalidations;
735 if (!infos.isEmpty()) {
736 std::sort(infos.begin(), infos.end(), &comparePaintInvalidationInfo);
737 std::unique_ptr<JSONArray> paintInvalidationsJSON = JSONArray::create();
738 for (auto& info : infos) {
739 std::unique_ptr<JSONObject> infoJSON = JSONObject::create();
740 infoJSON->setString("object", info.clientDebugName);
741 if (!info.rect.isEmpty())
742 infoJSON->setArray("rect", rectAsJSONArray(info.rect));
743 infoJSON->setString("reason",
744 paintInvalidationReasonToString(info.reason));
745 paintInvalidationsJSON->pushObject(std::move(infoJSON));
746 }
747 json->setArray("paintInvalidations", std::move(paintInvalidationsJSON));
748 }
749
750 Vector<UnderPaintInvalidation>& underPaintInvalidations =
751 it->value.underPaintInvalidations;
752 if (!underPaintInvalidations.isEmpty()) {
753 std::unique_ptr<JSONArray> underPaintInvalidationsJSON =
754 JSONArray::create();
755 for (auto& underPaintInvalidation : underPaintInvalidations) {
756 std::unique_ptr<JSONObject> underPaintInvalidationJSON =
757 JSONObject::create();
758 underPaintInvalidationJSON->setDouble("x", underPaintInvalidation.x);
759 underPaintInvalidationJSON->setDouble("y", underPaintInvalidation.y);
760 underPaintInvalidationJSON->setString(
761 "oldPixel",
762 Color(underPaintInvalidation.oldPixel).nameForLayoutTreeAsText());
763 underPaintInvalidationJSON->setString(
764 "newPixel",
765 Color(underPaintInvalidation.newPixel).nameForLayoutTreeAsText());
766 underPaintInvalidationsJSON->pushObject(
767 std::move(underPaintInvalidationJSON));
768 }
769 json->setArray("underPaintInvalidations",
770 std::move(underPaintInvalidationsJSON));
771 }
772 }
773 }
774 678
775 if ((flags & LayerTreeIncludesPaintingPhases) && m_paintingPhase) { 679 if ((flags & LayerTreeIncludesPaintingPhases) && m_paintingPhase) {
776 std::unique_ptr<JSONArray> paintingPhasesJSON = JSONArray::create(); 680 std::unique_ptr<JSONArray> paintingPhasesJSON = JSONArray::create();
777 if (m_paintingPhase & GraphicsLayerPaintBackground) 681 if (m_paintingPhase & GraphicsLayerPaintBackground)
778 paintingPhasesJSON->pushString("GraphicsLayerPaintBackground"); 682 paintingPhasesJSON->pushString("GraphicsLayerPaintBackground");
779 if (m_paintingPhase & GraphicsLayerPaintForeground) 683 if (m_paintingPhase & GraphicsLayerPaintForeground)
780 paintingPhasesJSON->pushString("GraphicsLayerPaintForeground"); 684 paintingPhasesJSON->pushString("GraphicsLayerPaintForeground");
781 if (m_paintingPhase & GraphicsLayerPaintMask) 685 if (m_paintingPhase & GraphicsLayerPaintMask)
782 paintingPhasesJSON->pushString("GraphicsLayerPaintMask"); 686 paintingPhasesJSON->pushString("GraphicsLayerPaintMask");
783 if (m_paintingPhase & GraphicsLayerPaintChildClippingMask) 687 if (m_paintingPhase & GraphicsLayerPaintChildClippingMask)
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
1037 void GraphicsLayer::setIsRootForIsolatedGroup(bool isolated) { 941 void GraphicsLayer::setIsRootForIsolatedGroup(bool isolated) {
1038 if (m_isRootForIsolatedGroup == isolated) 942 if (m_isRootForIsolatedGroup == isolated)
1039 return; 943 return;
1040 m_isRootForIsolatedGroup = isolated; 944 m_isRootForIsolatedGroup = isolated;
1041 platformLayer()->setIsRootForIsolatedGroup(isolated); 945 platformLayer()->setIsRootForIsolatedGroup(isolated);
1042 } 946 }
1043 947
1044 void GraphicsLayer::setContentsNeedsDisplay() { 948 void GraphicsLayer::setContentsNeedsDisplay() {
1045 if (WebLayer* contentsLayer = contentsLayerIfRegistered()) { 949 if (WebLayer* contentsLayer = contentsLayerIfRegistered()) {
1046 contentsLayer->invalidate(); 950 contentsLayer->invalidate();
1047 trackPaintInvalidation(*this, m_contentsRect, PaintInvalidationFull); 951 trackRasterInvalidation(*this, m_contentsRect, PaintInvalidationFull);
1048 } 952 }
1049 } 953 }
1050 954
1051 void GraphicsLayer::setNeedsDisplay() { 955 void GraphicsLayer::setNeedsDisplay() {
1052 if (!drawsContent()) 956 if (!drawsContent())
1053 return; 957 return;
1054 958
1055 // TODO(chrishtr): stop invalidating the rects once FrameView::paintRecursivel y does so. 959 // TODO(chrishtr): stop invalidating the rects once FrameView::paintRecursivel y does so.
1056 m_layer->layer()->invalidate(); 960 m_layer->layer()->invalidate();
1057 for (size_t i = 0; i < m_linkHighlights.size(); ++i) 961 for (size_t i = 0; i < m_linkHighlights.size(); ++i)
1058 m_linkHighlights[i]->invalidate(); 962 m_linkHighlights[i]->invalidate();
1059 getPaintController().invalidateAll(); 963 getPaintController().invalidateAll();
1060 964
1061 trackPaintInvalidation(*this, IntRect(IntPoint(), expandedIntSize(m_size)), 965 trackRasterInvalidation(*this, IntRect(IntPoint(), expandedIntSize(m_size)),
1062 PaintInvalidationFull); 966 PaintInvalidationFull);
1063 } 967 }
1064 968
1065 void GraphicsLayer::setNeedsDisplayInRect( 969 void GraphicsLayer::setNeedsDisplayInRect(
1066 const IntRect& rect, 970 const IntRect& rect,
1067 PaintInvalidationReason invalidationReason, 971 PaintInvalidationReason invalidationReason,
1068 const DisplayItemClient& client) { 972 const DisplayItemClient& client) {
1069 if (!drawsContent()) 973 if (!drawsContent())
1070 return; 974 return;
1071 975
1072 m_layer->layer()->invalidateRect(rect); 976 m_layer->layer()->invalidateRect(rect);
1073 if (firstPaintInvalidationTrackingEnabled()) 977 if (firstPaintInvalidationTrackingEnabled())
1074 m_debugInfo.appendAnnotatedInvalidateRect(rect, invalidationReason); 978 m_debugInfo.appendAnnotatedInvalidateRect(rect, invalidationReason);
1075 for (size_t i = 0; i < m_linkHighlights.size(); ++i) 979 for (size_t i = 0; i < m_linkHighlights.size(); ++i)
1076 m_linkHighlights[i]->invalidate(); 980 m_linkHighlights[i]->invalidate();
1077 981
1078 trackPaintInvalidation(client, rect, invalidationReason); 982 trackRasterInvalidation(client, rect, invalidationReason);
1079 } 983 }
1080 984
1081 void GraphicsLayer::setContentsRect(const IntRect& rect) { 985 void GraphicsLayer::setContentsRect(const IntRect& rect) {
1082 if (rect == m_contentsRect) 986 if (rect == m_contentsRect)
1083 return; 987 return;
1084 988
1085 m_contentsRect = rect; 989 m_contentsRect = rect;
1086 updateContentsRect(); 990 updateContentsRect();
1087 } 991 }
1088 992
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1243 return pixelComponentsDiffer(SkColorGetA(p1), SkColorGetA(p2)) || 1147 return pixelComponentsDiffer(SkColorGetA(p1), SkColorGetA(p2)) ||
1244 pixelComponentsDiffer(SkColorGetR(p1), SkColorGetR(p2)) || 1148 pixelComponentsDiffer(SkColorGetR(p1), SkColorGetR(p2)) ||
1245 pixelComponentsDiffer(SkColorGetG(p1), SkColorGetG(p2)) || 1149 pixelComponentsDiffer(SkColorGetG(p1), SkColorGetG(p2)) ||
1246 pixelComponentsDiffer(SkColorGetB(p1), SkColorGetB(p2)); 1150 pixelComponentsDiffer(SkColorGetB(p1), SkColorGetB(p2));
1247 } 1151 }
1248 1152
1249 void GraphicsLayer::checkPaintUnderInvalidations(const SkPicture& newPicture) { 1153 void GraphicsLayer::checkPaintUnderInvalidations(const SkPicture& newPicture) {
1250 if (!drawsContent()) 1154 if (!drawsContent())
1251 return; 1155 return;
1252 1156
1253 auto it = paintInvalidationTrackingMap().find(this); 1157 RasterInvalidationTracking* tracking =
1254 if (it == paintInvalidationTrackingMap().end()) 1158 rasterInvalidationTrackingMap().find(this);
1255 return; 1159 if (!tracking)
1256 PaintInvalidationTracking& tracking = it->value;
1257 if (!tracking.lastPaintedPicture)
1258 return; 1160 return;
1259 1161
1260 IntRect rect = intersection(tracking.lastInterestRect, interestRect()); 1162 if (!tracking->lastPaintedPicture)
1163 return;
1164
1165 IntRect rect = intersection(tracking->lastInterestRect, interestRect());
1261 if (rect.isEmpty()) 1166 if (rect.isEmpty())
1262 return; 1167 return;
1263 1168
1264 SkBitmap oldBitmap; 1169 SkBitmap oldBitmap;
1265 oldBitmap.allocPixels( 1170 oldBitmap.allocPixels(
1266 SkImageInfo::MakeN32Premul(rect.width(), rect.height())); 1171 SkImageInfo::MakeN32Premul(rect.width(), rect.height()));
1267 { 1172 {
1268 SkCanvas canvas(oldBitmap); 1173 SkCanvas canvas(oldBitmap);
1269 canvas.clear(SK_ColorTRANSPARENT); 1174 canvas.clear(SK_ColorTRANSPARENT);
1270 canvas.translate(-rect.x(), -rect.y()); 1175 canvas.translate(-rect.x(), -rect.y());
1271 canvas.drawPicture(tracking.lastPaintedPicture.get()); 1176 canvas.drawPicture(tracking->lastPaintedPicture.get());
1272 } 1177 }
1273 1178
1274 SkBitmap newBitmap; 1179 SkBitmap newBitmap;
1275 newBitmap.allocPixels( 1180 newBitmap.allocPixels(
1276 SkImageInfo::MakeN32Premul(rect.width(), rect.height())); 1181 SkImageInfo::MakeN32Premul(rect.width(), rect.height()));
1277 { 1182 {
1278 SkCanvas canvas(newBitmap); 1183 SkCanvas canvas(newBitmap);
1279 canvas.clear(SK_ColorTRANSPARENT); 1184 canvas.clear(SK_ColorTRANSPARENT);
1280 canvas.translate(-rect.x(), -rect.y()); 1185 canvas.translate(-rect.x(), -rect.y());
1281 canvas.drawPicture(&newPicture); 1186 canvas.drawPicture(&newPicture);
1282 } 1187 }
1283 1188
1284 oldBitmap.lockPixels(); 1189 oldBitmap.lockPixels();
1285 newBitmap.lockPixels(); 1190 newBitmap.lockPixels();
1286 int mismatchingPixels = 0; 1191 int mismatchingPixels = 0;
1287 static const int maxMismatchesToReport = 50; 1192 static const int maxMismatchesToReport = 50;
1288 for (int bitmapY = 0; bitmapY < rect.height(); ++bitmapY) { 1193 for (int bitmapY = 0; bitmapY < rect.height(); ++bitmapY) {
1289 int layerY = bitmapY + rect.y(); 1194 int layerY = bitmapY + rect.y();
1290 for (int bitmapX = 0; bitmapX < rect.width(); ++bitmapX) { 1195 for (int bitmapX = 0; bitmapX < rect.width(); ++bitmapX) {
1291 int layerX = bitmapX + rect.x(); 1196 int layerX = bitmapX + rect.x();
1292 SkColor oldPixel = oldBitmap.getColor(bitmapX, bitmapY); 1197 SkColor oldPixel = oldBitmap.getColor(bitmapX, bitmapY);
1293 SkColor newPixel = newBitmap.getColor(bitmapX, bitmapY); 1198 SkColor newPixel = newBitmap.getColor(bitmapX, bitmapY);
1294 if (pixelsDiffer(oldPixel, newPixel) && 1199 if (pixelsDiffer(oldPixel, newPixel) &&
1295 !tracking.paintInvalidationRegionSinceLastPaint.contains( 1200 !tracking->rasterInvalidationRegionSinceLastPaint.contains(
1296 IntPoint(layerX, layerY))) { 1201 IntPoint(layerX, layerY))) {
1297 if (mismatchingPixels < maxMismatchesToReport) { 1202 if (mismatchingPixels < maxMismatchesToReport) {
1298 UnderPaintInvalidation underPaintInvalidation = {layerX, layerY, 1203 UnderPaintInvalidation underPaintInvalidation = {layerX, layerY,
1299 oldPixel, newPixel}; 1204 oldPixel, newPixel};
1300 tracking.underPaintInvalidations.append(underPaintInvalidation); 1205 tracking->underPaintInvalidations.append(underPaintInvalidation);
1301 LOG(ERROR) << debugName() 1206 LOG(ERROR) << debugName()
1302 << " Uninvalidated old/new pixels mismatch at " << layerX 1207 << " Uninvalidated old/new pixels mismatch at " << layerX
1303 << "," << layerY << " old:" << std::hex << oldPixel 1208 << "," << layerY << " old:" << std::hex << oldPixel
1304 << " new:" << newPixel; 1209 << " new:" << newPixel;
1305 } else if (mismatchingPixels == maxMismatchesToReport) { 1210 } else if (mismatchingPixels == maxMismatchesToReport) {
1306 LOG(ERROR) << "and more..."; 1211 LOG(ERROR) << "and more...";
1307 } 1212 }
1308 ++mismatchingPixels; 1213 ++mismatchingPixels;
1309 *newBitmap.getAddr32(bitmapX, bitmapY) = 1214 *newBitmap.getAddr32(bitmapX, bitmapY) =
1310 SkColorSetARGB(0xFF, 0xA0, 0, 0); // Dark red. 1215 SkColorSetARGB(0xFF, 0xA0, 0, 0); // Dark red.
(...skipping 21 matching lines...) Expand all
1332 void showGraphicsLayerTree(const blink::GraphicsLayer* layer) { 1237 void showGraphicsLayerTree(const blink::GraphicsLayer* layer) {
1333 if (!layer) { 1238 if (!layer) {
1334 fprintf(stderr, "Cannot showGraphicsLayerTree for (nil).\n"); 1239 fprintf(stderr, "Cannot showGraphicsLayerTree for (nil).\n");
1335 return; 1240 return;
1336 } 1241 }
1337 1242
1338 String output = layer->layerTreeAsText(blink::LayerTreeIncludesDebugInfo); 1243 String output = layer->layerTreeAsText(blink::LayerTreeIncludesDebugInfo);
1339 fprintf(stderr, "%s\n", output.utf8().data()); 1244 fprintf(stderr, "%s\n", output.utf8().data());
1340 } 1245 }
1341 #endif 1246 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698